Skip to content
This repository was archived by the owner on Apr 25, 2024. It is now read-only.

Commit b01ca34

Browse files
author
François Guyot
committed
Merge branch 'textual-bump' into kcfg-key
2 parents 4534ad4 + e64226c commit b01ca34

38 files changed

+1281
-660
lines changed

.github/workflows/test-pr.yml

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
token: ${{ secrets.JENKINS_GITHUB_PAT }}
1919
# fetch-depth 0 means deep clone the repo
2020
fetch-depth: 0
21-
- name: 'Update Version'
21+
- name: 'Update version'
2222
run: |
2323
set -x
2424
git config user.name devops
@@ -72,29 +72,42 @@ jobs:
7272
integration-tests:
7373
needs: code-quality-checks
7474
name: 'Integration Tests'
75-
runs-on: [self-hosted, linux, normal-ephemeral]
75+
runs-on: [self-hosted, linux, normal]
7676
strategy:
7777
matrix:
7878
python-version: ['3.10', '3.11']
7979
steps:
8080
- name: 'Check out code'
8181
uses: actions/checkout@v3
82-
- name: 'Install Python'
83-
uses: actions/setup-python@v4
84-
with:
85-
python-version: ${{ matrix.python-version }}
86-
- name: 'Install Poetry'
87-
uses: Gr1N/setup-poetry@v8
88-
- name: 'Install K'
82+
- name: 'Build Docker image'
83+
run: |
84+
COMMIT=$(git rev-parse --short=7 HEAD)
85+
K_VERSION=$(cut --delim=v --field=2 deps/k_release)
86+
87+
docker build . \
88+
--build-arg PYTHON_VERSION=${{ matrix.python-version }} \
89+
--build-arg K_VERSION=${K_VERSION} \
90+
--tag runtimeverificationinc/pyk-ci:${COMMIT}
91+
92+
docker run \
93+
--name pyk-ci \
94+
--rm \
95+
--interactive \
96+
--tty \
97+
--detach \
98+
--workdir /home/user \
99+
runtimeverificationinc/pyk-ci:${COMMIT}
100+
101+
docker cp . pyk-ci:/home/user
102+
docker exec pyk-ci chown -R user:user /home/user
103+
- name: 'Set Python version'
104+
run: docker exec --user user pyk-ci poetry env use ${{ matrix.python-version }}
105+
- name: 'Build and run integration tests'
106+
run: docker exec --user user pyk-ci make cov-integration COV_ARGS=-n8
107+
- name: 'Tear down Docker container'
108+
if: always()
89109
run: |
90-
K_VERSION=$(cat deps/k_release)
91-
DEB_PACKAGE_NAME=kframework_${K_VERSION}_amd64_ubuntu_jammy.deb
92-
wget https://github.com/runtimeverification/k/releases/download/v${K_VERSION}/${DEB_PACKAGE_NAME}
93-
sudo apt-get update
94-
sudo apt-get -y install graphviz ./${DEB_PACKAGE_NAME}
95-
kompile --version
96-
- name: 'Run integration tests'
97-
run: make cov-integration COV_ARGS='-n8'
110+
docker stop --time=0 pyk-ci
98111
99112
build-on-nix:
100113
needs: code-quality-checks

.github/workflows/update-version.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: 'Update Version'
2+
on:
3+
push:
4+
branches:
5+
- '_update-deps/runtimeverification/k'
6+
workflow_dispatch:
7+
concurrency:
8+
group: ${{ github.workflow }}-${{ github.ref }}
9+
cancel-in-progress: true
10+
11+
jobs:
12+
13+
update-versions:
14+
name: 'Update K Version'
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: 'Check out code'
18+
uses: actions/checkout@v3
19+
with:
20+
submodules: recursive
21+
token: ${{ secrets.JENKINS_GITHUB_PAT }}
22+
- name: 'Configure GitHub user'
23+
run: |
24+
git config user.name devops
25+
git config user.email [email protected]
26+
- name: 'Update K version'
27+
run: |
28+
K_VERSION=$(cat deps/k_release)
29+
sed --in-place "s/^K_VERSION: Final = '.*'$/K_VERSION: Final = '${K_VERSION}'/" src/pyk/__init__.py
30+
git add --update && git commit -m "Set K Version: ${K_VERSION}" || true
31+
- name: 'Push updates'
32+
run: git push

Dockerfile

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ FROM runtimeverificationinc/kframework-k:ubuntu-${K_DISTRO}-${K_VERSION}
44

55
ARG PYTHON_VERSION=3.10
66

7-
RUN apt-get -y update \
8-
&& apt-get -y install \
9-
curl \
10-
graphviz \
11-
python${PYTHON_VERSION} \
12-
python${PYTHON_VERSION}-dev \
7+
RUN apt-get -y update \
8+
&& apt-get -y install \
9+
curl \
10+
graphviz \
11+
python$PYTHON_VERSION \
12+
python$PYTHON_VERSION-dev \
1313
&& apt-get -y clean
1414

1515
RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/usr python3 - \

deps/k_release

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.6.110
1+
5.6.114

package/version

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1+
<<<<<<< HEAD
12
0.1.306
3+
=======
4+
0.1.318
5+
>>>>>>> textual-bump

pyproject.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ build-backend = "poetry.core.masonry.api"
44

55
[tool.poetry]
66
name = "pyk"
7+
<<<<<<< HEAD
78
version = "0.1.306"
9+
=======
10+
version = "0.1.318"
11+
>>>>>>> textual-bump
812
description = ""
913
authors = [
1014
"Runtime Verification, Inc. <[email protected]>",
@@ -18,7 +22,7 @@ filelock = "^3.9.0"
1822
graphviz = "^0.20.1"
1923
psutil = "^5.9.4"
2024
pybind11 = "^2.10.3"
21-
textual = "^0.10.1"
25+
textual = "^0.27.0"
2226
tomli = "^2.0.1"
2327

2428
[tool.poetry.group.dev.dependencies]
@@ -41,6 +45,7 @@ types-psutil = "^5.9.5.10"
4145

4246
[tool.poetry.scripts]
4347
pyk = "pyk.__main__:main"
48+
pyk-covr = "pyk.kcovr:main"
4449
kbuild = "pyk.kbuild.__main__:main"
4550
krepl = "pyk.krepl.__main__:main"
4651
kore-exec-covr = "pyk.kore_exec_covr.__main__:main"

src/pyk/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from __future__ import annotations
2+
3+
from typing import TYPE_CHECKING
4+
5+
if TYPE_CHECKING:
6+
from typing import Final
7+
8+
9+
K_VERSION: Final = '5.6.114'

src/pyk/__main__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
from .kast.inner import KInner
1515
from .kast.manip import flatten_label, minimize_rule, minimize_term, propagate_up_constraints, remove_source_map
1616
from .kast.outer import read_kast_definition
17+
from .kast.pretty import PrettyPrinter
1718
from .kore.parser import KoreParser
1819
from .kore.syntax import Pattern
19-
from .ktool.kprint import KPrint, build_symbol_table, pretty_print_kast
20+
from .ktool.kprint import KPrint
2021
from .ktool.kprove import KProve
2122
from .prelude.k import GENERATED_TOP_CELL
2223
from .prelude.ml import is_top, mlAnd, mlOr
@@ -113,14 +114,14 @@ def exec_graph_imports(args: Namespace) -> None:
113114

114115
def exec_coverage(args: Namespace) -> None:
115116
kompiled_dir: Path = args.definition_dir
116-
json_definition = remove_source_map(read_kast_definition(kompiled_dir / 'compiled.json'))
117-
symbol_table = build_symbol_table(json_definition)
117+
definition = remove_source_map(read_kast_definition(kompiled_dir / 'compiled.json'))
118+
pretty_printer = PrettyPrinter(definition)
118119
for rid in args.coverage_file:
119-
rule = minimize_rule(strip_coverage_logger(get_rule_by_id(json_definition, rid.strip())))
120+
rule = minimize_rule(strip_coverage_logger(get_rule_by_id(definition, rid.strip())))
120121
args.output.write('\n\n')
121122
args.output.write('Rule: ' + rid.strip())
122123
args.output.write('\nUnparsed:\n')
123-
args.output.write(pretty_print_kast(rule, symbol_table))
124+
args.output.write(pretty_printer.print(rule))
124125
_LOGGER.info(f'Wrote file: {args.output.name}')
125126

126127

src/pyk/kast/manip.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,36 @@ def flatten_label(label: str, kast: KInner) -> list[KInner]:
3737
return [kast]
3838

3939

40+
def sort_assoc_label(label: str, kast: KInner) -> KInner:
41+
res: KInner | None = None
42+
if type(kast) is KApply and kast.label.name == label:
43+
terms = sorted(flatten_label(label, kast))
44+
for term in reversed(terms):
45+
if not res:
46+
res = term
47+
else:
48+
res = kast.label(term, res)
49+
assert res is not None
50+
return res
51+
return kast
52+
53+
54+
def sort_ac_collections(definition: KDefinition, kast: KInner) -> KInner:
55+
ac_hooks = {'MAP.concat', 'SET.concat', 'BAG.concat'}
56+
ac_collections = [
57+
prod.klabel.name
58+
for prod in definition.productions
59+
if prod.klabel is not None and 'hook' in prod.att and prod.att['hook'] in ac_hooks
60+
]
61+
62+
def _sort_ac_collections(_kast: KInner) -> KInner:
63+
if type(_kast) is KApply and _kast.label.name in ac_collections:
64+
return sort_assoc_label(_kast.label.name, _kast)
65+
return _kast
66+
67+
return top_down(_sort_ac_collections, kast)
68+
69+
4070
def if_ktype(ktype: type[KI], then: Callable[[KI], KInner]) -> Callable[[KInner], KInner]:
4171
def fun(term: KInner) -> KInner:
4272
if isinstance(term, ktype):

src/pyk/kast/outer.py

Lines changed: 76 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,6 +1078,47 @@ def _compute_subsorts(self, sort: KSort) -> list[KSort]:
10781078
_subsorts.extend([_subsort] + self.subsorts(prod.items[0].sort))
10791079
return list(set(_subsorts))
10801080

1081+
def sort(self, kast: KInner) -> KSort | None:
1082+
match kast:
1083+
case KToken(_, sort) | KVariable(_, sort):
1084+
return sort
1085+
case KRewrite(lhs, rhs):
1086+
sort = self.sort(lhs)
1087+
return sort if sort == self.sort(rhs) else None
1088+
case KSequence(_):
1089+
return KSort('K')
1090+
case KApply(label, _):
1091+
prod = self.production_for_klabel(label)
1092+
if prod.sort not in prod.params:
1093+
return prod.sort
1094+
elif len(prod.params) == len(label.params):
1095+
param_dict: dict[KSort, KSort] = {}
1096+
for pparam, lparam in zip(prod.params, label.params, strict=True):
1097+
if pparam not in param_dict:
1098+
param_dict[pparam] = lparam
1099+
elif param_dict[pparam] != lparam:
1100+
return None
1101+
if prod.sort in param_dict and param_dict[prod.sort] not in prod.params:
1102+
return param_dict[prod.sort]
1103+
return None
1104+
case _:
1105+
return None
1106+
1107+
def sort_strict(self, kast: KInner) -> KSort:
1108+
sort = self.sort(kast)
1109+
if sort is None:
1110+
raise ValueError(f'Could not determine sort of term: {kast}')
1111+
return sort
1112+
1113+
def greatest_common_subsort(self, sort1: KSort, sort2: KSort) -> KSort | None:
1114+
if sort1 == sort2:
1115+
return sort1
1116+
if sort1 in self.subsorts(sort2):
1117+
return sort1
1118+
if sort2 in self.subsorts(sort1):
1119+
return sort2
1120+
return None
1121+
10811122
def sort_vars_subst(self, kast: KInner) -> Subst:
10821123
_var_sort_occurrences = var_occurrences(kast)
10831124
subst = {}
@@ -1100,21 +1141,14 @@ def _sort_contexts(_kast: KInner) -> None:
11001141
collect(_sort_contexts, kast)
11011142

11021143
for vname, _voccurrences in _var_sort_occurrences.items():
1103-
voccurrences = list(unique(_voccurrences))
1104-
if len(voccurrences) > 0:
1105-
vsort = voccurrences[0].sort
1106-
if len(voccurrences) > 1:
1107-
for v in voccurrences[1:]:
1108-
if vsort is None and v.sort is not None:
1109-
vsort = v.sort
1110-
elif vsort is not None and v.sort is not None:
1111-
if vsort != v.sort:
1112-
if v.sort in self.subsorts(vsort):
1113-
vsort = v.sort
1114-
elif vsort not in self.subsorts(v.sort):
1115-
raise ValueError(
1116-
f'Could not find common subsort among variable occurrences: {voccurrences}'
1117-
)
1144+
vsorts = list(unique(v.sort for v in _voccurrences if v.sort is not None))
1145+
if len(vsorts) > 0:
1146+
vsort = vsorts[0]
1147+
for s in vsorts[1:]:
1148+
_vsort = self.greatest_common_subsort(vsort, s)
1149+
if _vsort is None:
1150+
raise ValueError(f'Cannot compute greatest common subsort of {vname}: {(vsort, s)}')
1151+
vsort = _vsort
11181152
subst[vname] = KVariable(vname, sort=vsort)
11191153

11201154
return Subst(subst)
@@ -1126,6 +1160,33 @@ def sort_vars(self, kast: KInner, sort: KSort | None = None) -> KInner:
11261160
subst = self.sort_vars_subst(kast)
11271161
return subst(kast)
11281162

1163+
# Best-effort addition of sort parameters to klabels, context insensitive
1164+
def add_sort_params(self, kast: KInner) -> KInner:
1165+
def _add_sort_params(_k: KInner) -> KInner:
1166+
if type(_k) is KApply:
1167+
prod = self.production_for_klabel(_k.label)
1168+
if len(_k.label.params) == 0 and len(prod.params) > 0:
1169+
sort_dict: dict[KSort, KSort] = {}
1170+
for psort, asort in zip(prod.argument_sorts, map(self.sort, _k.args), strict=True):
1171+
if asort is None:
1172+
_LOGGER.warning(
1173+
f'Failed to add sort parameter, unable to determine sort for argument in production: {(prod, psort, asort)}'
1174+
)
1175+
return _k
1176+
if psort in prod.params:
1177+
if psort in sort_dict and sort_dict[psort] != asort:
1178+
_LOGGER.warning(
1179+
f'Failed to add sort parameter, sort mismatch between different occurances of sort parameter: {(prod, psort, sort_dict[psort], asort)}'
1180+
)
1181+
return _k
1182+
elif psort not in sort_dict:
1183+
sort_dict[psort] = asort
1184+
if all(p in sort_dict for p in prod.params):
1185+
return _k.let(label=KLabel(_k.label.name, [sort_dict[p] for p in prod.params]))
1186+
return _k
1187+
1188+
return bottom_up(_add_sort_params, kast)
1189+
11291190
def add_cell_map_items(self, kast: KInner) -> KInner:
11301191
# example:
11311192
# syntax AccountCellMap [cellCollection, hook(MAP.Map)]

0 commit comments

Comments
 (0)