Compare commits
1 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
f42e2053a9 | 2 months ago |
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Lezhi Ma
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@ -0,0 +1,189 @@
|
||||
# CBMC SpecGen 使用指南
|
||||
|
||||
## 🎉 恭喜!系统已成功安装并测试通过
|
||||
|
||||
### 🚀 快速开始
|
||||
|
||||
1. **设置 API 密钥**
|
||||
```bash
|
||||
echo "your_deepseek_api_key_here" > api_key.txt
|
||||
```
|
||||
|
||||
2. **创建测试目录**
|
||||
```bash
|
||||
mkdir test_samples
|
||||
cp test_sample.c test_samples/
|
||||
```
|
||||
|
||||
3. **运行批处理**
|
||||
```bash
|
||||
python src/tools/batch_folder_flow.py --input-dir ./test_samples --output-dir ./output
|
||||
```
|
||||
### 📁 可用工具
|
||||
|
||||
#### 🔧 生产级工具 (推荐)
|
||||
```bash
|
||||
python src/tools/batch_folder_flow.py --help
|
||||
```
|
||||
- 完整的批处理解决方案
|
||||
- 高级文件过滤
|
||||
- 综合报告 (HTML, JSON, CSV)
|
||||
- 邮件通知
|
||||
- 增强的错误处理
|
||||
|
||||
#### ⚙️ 开发测试工具
|
||||
```bash
|
||||
python src/tools/batch_processor.py --help
|
||||
```
|
||||
- 核心处理引擎
|
||||
- 开发者调试功能
|
||||
- 单文件测试
|
||||
- 性能分析
|
||||
|
||||
#### 🎯 工具选择器
|
||||
```bash
|
||||
python src/tools/cbmc_batch.py
|
||||
```
|
||||
- 帮助选择合适的工具
|
||||
- 显示工具比较
|
||||
|
||||
### 📊 功能特性
|
||||
|
||||
#### ✅ 已实现的功能
|
||||
- [x] SHA1 文件名冲突防护
|
||||
- [x] 并行批处理
|
||||
- [x] 速率限制 (Token Bucket)
|
||||
- [x] CBMC 验证集成
|
||||
- [x] API 重试机制
|
||||
- [x] 恢复中断的批处理
|
||||
- [x] 多格式报告生成
|
||||
- [x] 文件大小过滤
|
||||
- [x] 详细的日志记录
|
||||
- [x] 优雅的关闭处理
|
||||
|
||||
#### 🔧 技术特点
|
||||
- **安全性**: SHA1 哈希防止文件名冲突
|
||||
- **可靠性**: 指数退避重试机制
|
||||
- **可扩展性**: 线程池并行处理
|
||||
- **可观察性**: 详细的进度报告和统计
|
||||
- **容错性**: 优雅的错误处理和恢复
|
||||
|
||||
### 📋 测试验证
|
||||
|
||||
#### 基础功能测试
|
||||
```bash
|
||||
python test_system.py
|
||||
```
|
||||
|
||||
#### 集成功能测试
|
||||
```bash
|
||||
python test_integration.py
|
||||
```
|
||||
|
||||
#### 单元测试
|
||||
```bash
|
||||
python -m pytest src/tests/ -v
|
||||
```
|
||||
|
||||
### 🎯 使用示例
|
||||
|
||||
#### 基础批处理
|
||||
```bash
|
||||
python src/tools/batch_folder_flow.py \
|
||||
--input-dir ./src \
|
||||
--output-dir ./batch_output
|
||||
```
|
||||
|
||||
#### 高性能处理
|
||||
```bash
|
||||
python src/tools/batch_folder_flow.py \
|
||||
--input-dir ./src \
|
||||
--output-dir ./output \
|
||||
--workers 5 \
|
||||
--rate-limit 3
|
||||
```
|
||||
|
||||
#### 恢复中断的批处理
|
||||
```bash
|
||||
python src/tools/batch_folder_flow.py \
|
||||
--input-dir ./src \
|
||||
--output-dir ./output \
|
||||
--resume
|
||||
```
|
||||
|
||||
#### 文件大小过滤
|
||||
```bash
|
||||
python src/tools/batch_folder_flow.py \
|
||||
--input-dir ./src \
|
||||
--output-dir ./output \
|
||||
--min-file-size 1 \
|
||||
--max-file-size 100
|
||||
```
|
||||
|
||||
#### 预览处理
|
||||
```bash
|
||||
python src/tools/batch_folder_flow.py \
|
||||
--input-dir ./src \
|
||||
--dry-run
|
||||
```
|
||||
|
||||
### 📁 输出目录结构
|
||||
|
||||
```
|
||||
output/
|
||||
├── batch_reports/ # 批处理报告
|
||||
│ ├── batch_summary.json
|
||||
│ ├── batch_results.csv
|
||||
│ └── batch_report.md
|
||||
├── original_code/ # 原始代码
|
||||
├── generated_code/ # 生成的断言代码
|
||||
├── verification_results/ # CBMC 验证结果
|
||||
├── difference_analysis/ # 差异分析
|
||||
└── summaries/ # 摘要报告
|
||||
```
|
||||
|
||||
### 🔧 配置选项
|
||||
|
||||
#### 核心配置
|
||||
- `--workers`: 并行工作线程数 (默认: 3)
|
||||
- `--rate-limit`: API 速率限制 (默认: 2.0 请求/秒)
|
||||
- `--burst-capacity`: 突发容量 (默认: 8)
|
||||
- `--timeout`: 单文件超时时间 (默认: 300秒)
|
||||
|
||||
#### 高级配置
|
||||
- `--retry-attempts`: 重试次数 (默认: 3)
|
||||
- `--api-model`: API 模型 (默认: deepseek-chat)
|
||||
- `--api-temperature`: API 温度 (默认: 0.4)
|
||||
- `--generate-html-report`: 生成 HTML 报告
|
||||
- `--email-notification`: 邮件通知
|
||||
|
||||
### 🛠️ 故障排除
|
||||
|
||||
#### 常见问题
|
||||
1. **CBMC 未安装**: `sudo apt-get install cbmc`
|
||||
2. **API 密钥错误**: 检查 `api_key.txt` 文件
|
||||
3. **权限问题**: 确保输出目录可写
|
||||
4. **网络问题**: 检查 API 连接
|
||||
|
||||
#### 调试模式
|
||||
```bash
|
||||
python src/tools/batch_processor.py \
|
||||
--input-dir ./src \
|
||||
--output-dir ./debug \
|
||||
--single-file ./src/test.c \
|
||||
--debug-api \
|
||||
--verbose
|
||||
```
|
||||
|
||||
### 📈 性能监控
|
||||
|
||||
系统提供详细的性能统计:
|
||||
- 处理时间分析
|
||||
- API vs CBMC 时间占比
|
||||
- 成功率统计
|
||||
- 吞吐量计算
|
||||
- 错误分类统计
|
||||
|
||||
---
|
||||
|
||||
🎉 **系统已准备就绪,开始你的 CBMC 验证之旅吧!**
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
# Activation script for CBMC SpecGen virtual environment
|
||||
|
||||
# Check if virtual environment exists
|
||||
if [ ! -d "venv" ]; then
|
||||
echo "Error: Virtual environment not found. Please run the setup first."
|
||||
echo "Run: python3 -m venv venv && source venv/bin/activate && pip install requests"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Activating CBMC SpecGen virtual environment..."
|
||||
echo "Use the following command to activate the environment:"
|
||||
echo "source venv/bin/activate"
|
||||
echo ""
|
||||
echo "After activation, you can test with:"
|
||||
echo " python test_generation_step.py --input testfiles/simple_test.c --verbose"
|
||||
echo " python test_generation_step.py --input testfiles/array_sum.c --output output.c"
|
||||
echo ""
|
||||
echo "Environment info:"
|
||||
echo " Python: $(python --version)"
|
||||
echo " Requests: $(which python > /dev/null && python -c 'import requests; print(requests.__version__)' 2>/dev/null || echo 'Not installed')"
|
||||
echo " CBMC: $(which cbmc)"
|
||||
echo ""
|
||||
@ -0,0 +1 @@
|
||||
sk-80ef15ee12f944ef80c80b56d1e39f5a
|
||||
@ -0,0 +1,4 @@
|
||||
# Ignore everything in this directory
|
||||
*
|
||||
# Except this file
|
||||
!.gitignore
|
||||
@ -0,0 +1,106 @@
|
||||
|
||||
# CBMC SpecGen Batch Processing Report
|
||||
|
||||
## Batch Information
|
||||
- **Batch ID**: 20250925_144704
|
||||
- **Processing Mode**: Standard
|
||||
- **Start Time**: 2025-09-25 14:47:04
|
||||
- **End Time**: 2025-09-25 14:50:01
|
||||
- **Total Duration**: 176.43 seconds
|
||||
- **Input Directory**: testfiles/windmodel
|
||||
- **Output Directory**: output/test_output_fixed_detection
|
||||
|
||||
## Summary Statistics
|
||||
- **Total Files Processed**: 6
|
||||
- **Successful Files**: 6
|
||||
- **Failed Files**: 0
|
||||
- **Success Rate**: 100.0%
|
||||
- **API Failures**: 0
|
||||
- **CBMC Failures**: 0
|
||||
- **Internal Errors**: 0
|
||||
|
||||
## Performance Metrics
|
||||
- **Average Processing Time**: 91.84 seconds
|
||||
- **Average API Time**: 91.79 seconds
|
||||
- **Average CBMC Time**: 0.05 seconds
|
||||
- **Total Processing Time**: 551.06 seconds
|
||||
- **Fastest Processing**: 53.34 seconds
|
||||
- **Slowest Processing**: 176.43 seconds
|
||||
|
||||
## Header Dependency Statistics
|
||||
- **Total Header Files Processed**: 30
|
||||
- **Files with Header Dependencies**: 6
|
||||
- **Average Header Files per File**: 5.0
|
||||
- **Total Header Resolution Time**: 0.00 seconds
|
||||
- **Average Header Resolution Time**: 0.000 seconds
|
||||
- **Header Processing Efficiency**: 0.0%
|
||||
|
||||
## File Size Statistics
|
||||
|
||||
- **Average File Size**: 4423 bytes
|
||||
- **Min File Size**: 2186 bytes
|
||||
- **Max File Size**: 13559 bytes
|
||||
- **Total Input Size**: 26539 bytes
|
||||
|
||||
## Error Summary
|
||||
|
||||
## Non-Critical Issues Summary
|
||||
*Note: These are environment/dependency issues that do not affect functional verification success.*
|
||||
|
||||
### Header Files Missing
|
||||
- file /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c line 14 (1 occurrence)
|
||||
|
||||
### Syntax Errors
|
||||
- PARSING ERROR (3 occurrences)
|
||||
- file /tmp/cbmc_1ppznjxb/WindModeltestfinal_data_7d174a06.c line 155 (1 occurrence)
|
||||
|
||||
### Other Dependencies
|
||||
- the program has no entry point (3 occurrences)
|
||||
- GCC preprocessing failed (2 occurrences)
|
||||
- compilation terminated. (1 occurrence)
|
||||
|
||||
|
||||
## Detailed Results
|
||||
|
||||
| File | Status | Processing Time | API Time | CBMC Time | Headers | Header Time | Error |
|
||||
|------|--------|----------------|----------|-----------|---------|-------------|-------|
|
||||
| rtGetNaN.c | ✅ SUCCESS | 53.34s | 53.29s | 0.05s | 3 | - | |
|
||||
| rt_nonfinite.c | ✅ SUCCESS | 67.07s | 67.01s | 0.06s | 4 | - | |
|
||||
| main.c | ✅ SUCCESS | 80.77s | 80.73s | 0.04s | 6 | - | |
|
||||
| WindModeltestfinal_data.c | ✅ SUCCESS | 85.30s | 85.24s | 0.06s | 7 | - | |
|
||||
| rtGetInf.c | ✅ SUCCESS | 88.16s | 88.10s | 0.05s | 3 | - | |
|
||||
| WindModeltestfinal.c | ✅ SUCCESS | 176.43s | 176.37s | 0.05s | 7 | - | |
|
||||
|
||||
## Performance Analysis
|
||||
|
||||
### Throughput
|
||||
- **Files per Hour**: 39.2
|
||||
- **API Efficiency**: 99.9% of total time
|
||||
|
||||
### Time Distribution
|
||||
|
||||
- **Median Time**: 83.03 seconds
|
||||
- **Standard Deviation**: 43.43 seconds
|
||||
|
||||
## Recommendations
|
||||
|
||||
Based on the batch processing results:
|
||||
|
||||
### If Success Rate < 80%:
|
||||
- Review API configuration and rate limiting
|
||||
- Check input file quality and CBMC installation
|
||||
- Consider adjusting generation prompts
|
||||
|
||||
### If Average Processing Time > 60 seconds:
|
||||
- Optimize CBMC parameters for faster verification
|
||||
- Consider reducing API timeout settings
|
||||
- Check network connectivity to API
|
||||
|
||||
### If API Failures > 20%:
|
||||
- Verify API key and rate limit settings
|
||||
- Check DeepSeek API service status
|
||||
- Consider reducing concurrent workers
|
||||
|
||||
---
|
||||
|
||||
*Report generated on 2025-09-25 14:50:01*
|
||||
@ -0,0 +1,25 @@
|
||||
|
||||
📊 CBMC SpecGen Batch Processing - Executive Summary
|
||||
═════════════════════════════════════════════════════
|
||||
|
||||
📁 Batch: 20250925_144704
|
||||
⏱️ Duration: 176.4s if self.end_time else "In Progress"
|
||||
|
||||
📈 Results:
|
||||
• Total Files: 6
|
||||
• Success Rate: 100.0%
|
||||
• ✅ Successful: 6
|
||||
• ❌ Failed: 0
|
||||
|
||||
⚡ Performance:
|
||||
• Avg Time/File: 91.8s
|
||||
• API Time: 91.8s (100%)
|
||||
• CBMC Time: 0.1s (0%)
|
||||
|
||||
🔍 Error Breakdown:
|
||||
• API Failures: 0
|
||||
• CBMC Failures: 0
|
||||
• Internal Errors: 0
|
||||
📋 Non-Critical Issues: 6 files affected
|
||||
|
||||
═════════════════════════════════════════════════════
|
||||
@ -0,0 +1,106 @@
|
||||
|
||||
# CBMC SpecGen Batch Processing Report
|
||||
|
||||
## Batch Information
|
||||
- **Batch ID**: 20250925_150021
|
||||
- **Processing Mode**: Standard
|
||||
- **Start Time**: 2025-09-25 15:00:21
|
||||
- **End Time**: 2025-09-25 15:03:20
|
||||
- **Total Duration**: 178.75 seconds
|
||||
- **Input Directory**: testfiles/windmodel
|
||||
- **Output Directory**: output/test_output_fixed_detection
|
||||
|
||||
## Summary Statistics
|
||||
- **Total Files Processed**: 6
|
||||
- **Successful Files**: 6
|
||||
- **Failed Files**: 0
|
||||
- **Success Rate**: 100.0%
|
||||
- **API Failures**: 0
|
||||
- **CBMC Failures**: 0
|
||||
- **Internal Errors**: 0
|
||||
|
||||
## Performance Metrics
|
||||
- **Average Processing Time**: 90.72 seconds
|
||||
- **Average API Time**: 90.67 seconds
|
||||
- **Average CBMC Time**: 0.05 seconds
|
||||
- **Total Processing Time**: 544.34 seconds
|
||||
- **Fastest Processing**: 54.44 seconds
|
||||
- **Slowest Processing**: 178.75 seconds
|
||||
|
||||
## Header Dependency Statistics
|
||||
- **Total Header Files Processed**: 30
|
||||
- **Files with Header Dependencies**: 6
|
||||
- **Average Header Files per File**: 5.0
|
||||
- **Total Header Resolution Time**: 0.00 seconds
|
||||
- **Average Header Resolution Time**: 0.000 seconds
|
||||
- **Header Processing Efficiency**: 0.0%
|
||||
|
||||
## File Size Statistics
|
||||
|
||||
- **Average File Size**: 4423 bytes
|
||||
- **Min File Size**: 2186 bytes
|
||||
- **Max File Size**: 13559 bytes
|
||||
- **Total Input Size**: 26539 bytes
|
||||
|
||||
## Error Summary
|
||||
|
||||
## Non-Critical Issues Summary
|
||||
*Note: These are environment/dependency issues that do not affect functional verification success.*
|
||||
|
||||
### Header Files Missing
|
||||
- file /tmp/cbmc_wwuwk42w/main_0da782ec.c line 14 (1 occurrence)
|
||||
|
||||
### Syntax Errors
|
||||
- PARSING ERROR (3 occurrences)
|
||||
- file /tmp/cbmc_mw893uc4/WindModeltestfinal_data_8c401d52.c line 155 (1 occurrence)
|
||||
|
||||
### Other Dependencies
|
||||
- the program has no entry point (3 occurrences)
|
||||
- GCC preprocessing failed (2 occurrences)
|
||||
- compilation terminated. (1 occurrence)
|
||||
|
||||
|
||||
## Detailed Results
|
||||
|
||||
| File | Status | Processing Time | API Time | CBMC Time | Headers | Header Time | Error |
|
||||
|------|--------|----------------|----------|-----------|---------|-------------|-------|
|
||||
| rtGetNaN.c | ✅ SUCCESS | 54.44s | 54.39s | 0.05s | 3 | - | |
|
||||
| rt_nonfinite.c | ✅ SUCCESS | 57.20s | 57.15s | 0.04s | 4 | - | |
|
||||
| rtGetInf.c | ✅ SUCCESS | 68.57s | 68.52s | 0.05s | 3 | - | |
|
||||
| main.c | ✅ SUCCESS | 78.56s | 78.52s | 0.03s | 6 | - | |
|
||||
| WindModeltestfinal_data.c | ✅ SUCCESS | 106.82s | 106.76s | 0.06s | 7 | - | |
|
||||
| WindModeltestfinal.c | ✅ SUCCESS | 178.75s | 178.70s | 0.05s | 7 | - | |
|
||||
|
||||
## Performance Analysis
|
||||
|
||||
### Throughput
|
||||
- **Files per Hour**: 39.7
|
||||
- **API Efficiency**: 99.9% of total time
|
||||
|
||||
### Time Distribution
|
||||
|
||||
- **Median Time**: 73.56 seconds
|
||||
- **Standard Deviation**: 47.09 seconds
|
||||
|
||||
## Recommendations
|
||||
|
||||
Based on the batch processing results:
|
||||
|
||||
### If Success Rate < 80%:
|
||||
- Review API configuration and rate limiting
|
||||
- Check input file quality and CBMC installation
|
||||
- Consider adjusting generation prompts
|
||||
|
||||
### If Average Processing Time > 60 seconds:
|
||||
- Optimize CBMC parameters for faster verification
|
||||
- Consider reducing API timeout settings
|
||||
- Check network connectivity to API
|
||||
|
||||
### If API Failures > 20%:
|
||||
- Verify API key and rate limit settings
|
||||
- Check DeepSeek API service status
|
||||
- Consider reducing concurrent workers
|
||||
|
||||
---
|
||||
|
||||
*Report generated on 2025-09-25 15:03:20*
|
||||
@ -0,0 +1,25 @@
|
||||
|
||||
📊 CBMC SpecGen Batch Processing - Executive Summary
|
||||
═════════════════════════════════════════════════════
|
||||
|
||||
📁 Batch: 20250925_150021
|
||||
⏱️ Duration: 178.8s if self.end_time else "In Progress"
|
||||
|
||||
📈 Results:
|
||||
• Total Files: 6
|
||||
• Success Rate: 100.0%
|
||||
• ✅ Successful: 6
|
||||
• ❌ Failed: 0
|
||||
|
||||
⚡ Performance:
|
||||
• Avg Time/File: 90.7s
|
||||
• API Time: 90.7s (100%)
|
||||
• CBMC Time: 0.0s (0%)
|
||||
|
||||
🔍 Error Breakdown:
|
||||
• API Failures: 0
|
||||
• CBMC Failures: 0
|
||||
• Internal Errors: 0
|
||||
📋 Non-Critical Issues: 6 files affected
|
||||
|
||||
═════════════════════════════════════════════════════
|
||||
@ -0,0 +1,97 @@
|
||||
|
||||
# CBMC SpecGen Batch Processing Report
|
||||
|
||||
## Batch Information
|
||||
- **Batch ID**: 20251001_000809
|
||||
- **Processing Mode**: Standard
|
||||
- **Start Time**: 2025-10-01 00:08:09
|
||||
- **End Time**: 2025-10-01 00:10:25
|
||||
- **Total Duration**: 135.16 seconds
|
||||
- **Input Directory**: testfiles/windmodel
|
||||
- **Output Directory**: output/test_output_fixed_detection
|
||||
|
||||
## Summary Statistics
|
||||
- **Total Files Processed**: 6
|
||||
- **Successful Files**: 6
|
||||
- **Failed Files**: 0
|
||||
- **Success Rate**: 100.0%
|
||||
- **API Failures**: 0
|
||||
- **CBMC Failures**: 0
|
||||
- **Internal Errors**: 0
|
||||
|
||||
## Performance Metrics
|
||||
- **Average Processing Time**: 135.15 seconds
|
||||
- **Average API Time**: 135.03 seconds
|
||||
- **Average CBMC Time**: 0.12 seconds
|
||||
- **Total Processing Time**: 810.92 seconds
|
||||
- **Fastest Processing**: 135.15 seconds
|
||||
- **Slowest Processing**: 135.16 seconds
|
||||
|
||||
## Header Dependency Statistics
|
||||
- **Total Header Files Processed**: 30
|
||||
- **Files with Header Dependencies**: 6
|
||||
- **Average Header Files per File**: 5.0
|
||||
- **Total Header Resolution Time**: 0.00 seconds
|
||||
- **Average Header Resolution Time**: 0.000 seconds
|
||||
- **Header Processing Efficiency**: 0.0%
|
||||
|
||||
## File Size Statistics
|
||||
|
||||
- **Average File Size**: 4423 bytes
|
||||
- **Min File Size**: 2186 bytes
|
||||
- **Max File Size**: 13559 bytes
|
||||
- **Total Input Size**: 26539 bytes
|
||||
|
||||
## Error Summary
|
||||
|
||||
## Non-Critical Issues Summary
|
||||
*Note: These are environment/dependency issues that do not affect functional verification success.*
|
||||
|
||||
### Other Dependencies
|
||||
- the program has no entry point (6 occurrences)
|
||||
|
||||
|
||||
## Detailed Results
|
||||
|
||||
| File | Status | Processing Time | API Time | CBMC Time | Headers | Header Time | Error |
|
||||
|------|--------|----------------|----------|-----------|---------|-------------|-------|
|
||||
| rtGetInf.c | ✅ SUCCESS | 135.15s | 135.03s | 0.12s | 3 | - | |
|
||||
| rt_nonfinite.c | ✅ SUCCESS | 135.15s | 135.03s | 0.11s | 4 | - | |
|
||||
| main.c | ✅ SUCCESS | 135.15s | 135.02s | 0.13s | 6 | - | |
|
||||
| WindModeltestfinal_data.c | ✅ SUCCESS | 135.16s | 135.03s | 0.12s | 7 | - | |
|
||||
| rtGetNaN.c | ✅ SUCCESS | 135.15s | 135.02s | 0.12s | 3 | - | |
|
||||
| WindModeltestfinal.c | ✅ SUCCESS | 135.16s | 135.03s | 0.13s | 7 | - | |
|
||||
|
||||
## Performance Analysis
|
||||
|
||||
### Throughput
|
||||
- **Files per Hour**: 26.6
|
||||
- **API Efficiency**: 99.9% of total time
|
||||
|
||||
### Time Distribution
|
||||
|
||||
- **Median Time**: 135.15 seconds
|
||||
- **Standard Deviation**: 0.00 seconds
|
||||
|
||||
## Recommendations
|
||||
|
||||
Based on the batch processing results:
|
||||
|
||||
### If Success Rate < 80%:
|
||||
- Review API configuration and rate limiting
|
||||
- Check input file quality and CBMC installation
|
||||
- Consider adjusting generation prompts
|
||||
|
||||
### If Average Processing Time > 60 seconds:
|
||||
- Optimize CBMC parameters for faster verification
|
||||
- Consider reducing API timeout settings
|
||||
- Check network connectivity to API
|
||||
|
||||
### If API Failures > 20%:
|
||||
- Verify API key and rate limit settings
|
||||
- Check DeepSeek API service status
|
||||
- Consider reducing concurrent workers
|
||||
|
||||
---
|
||||
|
||||
*Report generated on 2025-10-01 00:10:25*
|
||||
@ -0,0 +1,25 @@
|
||||
|
||||
📊 CBMC SpecGen Batch Processing - Executive Summary
|
||||
═════════════════════════════════════════════════════
|
||||
|
||||
📁 Batch: 20251001_000809
|
||||
⏱️ Duration: 135.2s if self.end_time else "In Progress"
|
||||
|
||||
📈 Results:
|
||||
• Total Files: 6
|
||||
• Success Rate: 100.0%
|
||||
• ✅ Successful: 6
|
||||
• ❌ Failed: 0
|
||||
|
||||
⚡ Performance:
|
||||
• Avg Time/File: 135.2s
|
||||
• API Time: 135.0s (100%)
|
||||
• CBMC Time: 0.1s (0%)
|
||||
|
||||
🔍 Error Breakdown:
|
||||
• API Failures: 0
|
||||
• CBMC Failures: 0
|
||||
• Internal Errors: 0
|
||||
📋 Non-Critical Issues: 6 files affected
|
||||
|
||||
═════════════════════════════════════════════════════
|
||||
@ -0,0 +1,185 @@
|
||||
{
|
||||
"batch_id": "20250925_144704",
|
||||
"start_time": "2025-09-25T14:47:04.828436",
|
||||
"end_time": "2025-09-25T14:50:01.256893",
|
||||
"total_duration": 176.428457,
|
||||
"statistics": {
|
||||
"total_files": 6,
|
||||
"successful_files": 6,
|
||||
"failed_files": 0,
|
||||
"api_failures": 0,
|
||||
"cbmc_failures": 0,
|
||||
"internal_errors": 0,
|
||||
"success_rate": 100.0,
|
||||
"average_processing_time": 91.84348746140797,
|
||||
"average_api_time": 91.79034149646759,
|
||||
"average_cbmc_time": 0.05199519793192545,
|
||||
"total_processing_time": 551.0609247684479,
|
||||
"total_api_time": 550.7420489788055,
|
||||
"total_cbmc_time": 0.31197118759155273,
|
||||
"min_processing_time": 53.341498613357544,
|
||||
"max_processing_time": 176.42524528503418,
|
||||
"file_size_stats": {
|
||||
"average_size_bytes": 4423.166666666667,
|
||||
"min_size_bytes": 2186,
|
||||
"max_size_bytes": 13559,
|
||||
"total_size_bytes": 26539
|
||||
},
|
||||
"total_header_files_processed": 30,
|
||||
"average_header_files_per_file": 5.0,
|
||||
"total_header_resolution_time": 0.0,
|
||||
"average_header_resolution_time": 0.0,
|
||||
"files_with_headers": 6,
|
||||
"header_processing_efficiency": 0.0
|
||||
},
|
||||
"error_summary": {
|
||||
"status_counts": {},
|
||||
"error_message_counts": {},
|
||||
"non_critical_errors": {
|
||||
"Header Files Missing": [
|
||||
"file /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c line 14: /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c:14:10: fatal error: MPC5646C.h: 没有那个文件或目录"
|
||||
],
|
||||
"Syntax Errors": [
|
||||
"PARSING ERROR",
|
||||
"file /tmp/cbmc_1ppznjxb/WindModeltestfinal_data_7d174a06.c line 155: syntax error before '.'",
|
||||
"PARSING ERROR",
|
||||
"PARSING ERROR"
|
||||
],
|
||||
"Other Dependencies": [
|
||||
"the program has no entry point",
|
||||
"the program has no entry point",
|
||||
"compilation terminated.",
|
||||
"GCC preprocessing failed",
|
||||
"the program has no entry point",
|
||||
"GCC preprocessing failed"
|
||||
]
|
||||
}
|
||||
},
|
||||
"performance_metrics": {
|
||||
"throughput_files_per_hour": 39.197117830621316,
|
||||
"api_efficiency": 0.9994213420416693,
|
||||
"parallel_efficiency_estimate": 1.8140770679562965,
|
||||
"total_header_files_processed": 30,
|
||||
"files_with_header_dependencies": 6,
|
||||
"header_dependency_coverage": 100.0,
|
||||
"average_header_resolution_time": 0.0,
|
||||
"total_header_resolution_time": 0.0,
|
||||
"header_processing_overhead": 0.0,
|
||||
"time_distribution": {
|
||||
"fastest_file_time": 53.341498613357544,
|
||||
"slowest_file_time": 176.42524528503418,
|
||||
"median_time": 83.03253722190857,
|
||||
"std_deviation": 43.426533183791854
|
||||
}
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rtGetNaN.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 53.286742210388184,
|
||||
"cbmc_time": 0.05363059043884277,
|
||||
"total_time": 53.341498613357544,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rtGetNaN__dee5911b_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20250925_144758.c",
|
||||
"base_name": "rtGetNaN",
|
||||
"timestamp": "20250925_144758",
|
||||
"slug": "dee5911b"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rtGetNaN_0a261652\nfile /tmp/cbmc_qkcfmukk/rtGetNaN_0a261652.c line 37 function rtGetNaN: function '__CPROVER_isnormal' is not declared\nfile /tmp/cbmc_qkcfmukk/rtGetNaN_0a261652.c line 37 function rtGetNaN: function '__CPROVER_iszero' is not declared\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 3,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rt_nonfinite.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 67.00999569892883,
|
||||
"cbmc_time": 0.058539628982543945,
|
||||
"total_time": 67.0695583820343,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rt_nonfinite__02d9e270_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20250925_144811.c",
|
||||
"base_name": "rt_nonfinite",
|
||||
"timestamp": "20250925_144811",
|
||||
"slug": "02d9e270"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rt_nonfinite_a34994fc\nfile /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 52 function rt_InitInfAndNaN: function '__CPROVER_isnan' is not declared\nfile /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 54 function rt_InitInfAndNaN: function '__CPROVER_isnormal' is not declared\nfile /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 64 function rtIsInf: function '__CPROVER_isfinite' is not declared\nfile /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 65 function rtIsInf: function '__CPROVER_isinf' is not declared\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 4,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/main.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 80.73081040382385,
|
||||
"cbmc_time": 0.035784244537353516,
|
||||
"total_time": 80.76787829399109,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/main__f16070c3_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20250925_144825.c",
|
||||
"base_name": "main",
|
||||
"timestamp": "20250925_144825",
|
||||
"slug": "f16070c3"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nfile /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c line 14: /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c:14:10: fatal error: MPC5646C.h: 没有那个文件或目录\n 14 | #include \"MPC5646C.h\"\n | ^~~~~~~~~~~~\ncompilation terminated.\nGCC preprocessing failed\nPARSING ERROR\n",
|
||||
"header_files_processed": 6,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/WindModeltestfinal_data.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 85.23792243003845,
|
||||
"cbmc_time": 0.05837583541870117,
|
||||
"total_time": 85.29719614982605,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/WindModeltestfinal_data__b6221792_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20250925_144830.c",
|
||||
"base_name": "WindModeltestfinal_data",
|
||||
"timestamp": "20250925_144830",
|
||||
"slug": "b6221792"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nfile /tmp/cbmc_1ppznjxb/WindModeltestfinal_data_7d174a06.c line 155: syntax error before '.'\nPARSING ERROR\n",
|
||||
"header_files_processed": 7,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rtGetInf.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 88.10357189178467,
|
||||
"cbmc_time": 0.05455303192138672,
|
||||
"total_time": 88.15954804420471,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rtGetInf__12decf94_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20250925_144832.c",
|
||||
"base_name": "rtGetInf",
|
||||
"timestamp": "20250925_144832",
|
||||
"slug": "12decf94"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rtGetInf_fcf15e71\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 3,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/WindModeltestfinal.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 176.37300634384155,
|
||||
"cbmc_time": 0.05108785629272461,
|
||||
"total_time": 176.42524528503418,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/WindModeltestfinal__d3b72bcf_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20250925_145001.c",
|
||||
"base_name": "WindModeltestfinal",
|
||||
"timestamp": "20250925_145001",
|
||||
"slug": "d3b72bcf"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nfile /tmp/cbmc_c7hfrmq7/WindModeltestfinal_3c49a623.c line 304: /tmp/cbmc_c7hfrmq7/WindModeltestfinal_3c49a623.c:304:3: error: unterminated comment\n 304 | /* Switch: '<S10>/Switch' incorporates:\n | ^\nGCC preprocessing failed\nPARSING ERROR\n",
|
||||
"header_files_processed": 7,
|
||||
"header_resolution_time": 0.0
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,185 @@
|
||||
{
|
||||
"batch_id": "20250925_150021",
|
||||
"start_time": "2025-09-25T15:00:21.981184",
|
||||
"end_time": "2025-09-25T15:03:20.735801",
|
||||
"total_duration": 178.754617,
|
||||
"statistics": {
|
||||
"total_files": 6,
|
||||
"successful_files": 6,
|
||||
"failed_files": 0,
|
||||
"api_failures": 0,
|
||||
"cbmc_failures": 0,
|
||||
"internal_errors": 0,
|
||||
"success_rate": 100.0,
|
||||
"average_processing_time": 90.72299381097157,
|
||||
"average_api_time": 90.67452295621236,
|
||||
"average_cbmc_time": 0.047382354736328125,
|
||||
"total_processing_time": 544.3379628658295,
|
||||
"total_api_time": 544.0471377372742,
|
||||
"total_cbmc_time": 0.28429412841796875,
|
||||
"min_processing_time": 54.44276213645935,
|
||||
"max_processing_time": 178.75100374221802,
|
||||
"file_size_stats": {
|
||||
"average_size_bytes": 4423.166666666667,
|
||||
"min_size_bytes": 2186,
|
||||
"max_size_bytes": 13559,
|
||||
"total_size_bytes": 26539
|
||||
},
|
||||
"total_header_files_processed": 30,
|
||||
"average_header_files_per_file": 5.0,
|
||||
"total_header_resolution_time": 0.0,
|
||||
"average_header_resolution_time": 0.0,
|
||||
"files_with_headers": 6,
|
||||
"header_processing_efficiency": 0.0
|
||||
},
|
||||
"error_summary": {
|
||||
"status_counts": {},
|
||||
"error_message_counts": {},
|
||||
"non_critical_errors": {
|
||||
"Header Files Missing": [
|
||||
"file /tmp/cbmc_wwuwk42w/main_0da782ec.c line 14: /tmp/cbmc_wwuwk42w/main_0da782ec.c:14:10: fatal error: MPC5646C.h: 没有那个文件或目录"
|
||||
],
|
||||
"Syntax Errors": [
|
||||
"PARSING ERROR",
|
||||
"file /tmp/cbmc_mw893uc4/WindModeltestfinal_data_8c401d52.c line 155: syntax error before '.'",
|
||||
"PARSING ERROR",
|
||||
"PARSING ERROR"
|
||||
],
|
||||
"Other Dependencies": [
|
||||
"the program has no entry point",
|
||||
"the program has no entry point",
|
||||
"the program has no entry point",
|
||||
"compilation terminated.",
|
||||
"GCC preprocessing failed",
|
||||
"GCC preprocessing failed"
|
||||
]
|
||||
}
|
||||
},
|
||||
"performance_metrics": {
|
||||
"throughput_files_per_hour": 39.681230179648615,
|
||||
"api_efficiency": 0.9994657269042486,
|
||||
"parallel_efficiency_estimate": 1.8274390967327767,
|
||||
"total_header_files_processed": 30,
|
||||
"files_with_header_dependencies": 6,
|
||||
"header_dependency_coverage": 100.0,
|
||||
"average_header_resolution_time": 0.0,
|
||||
"total_header_resolution_time": 0.0,
|
||||
"header_processing_overhead": 0.0,
|
||||
"time_distribution": {
|
||||
"fastest_file_time": 54.44276213645935,
|
||||
"slowest_file_time": 178.75100374221802,
|
||||
"median_time": 73.56366574764252,
|
||||
"std_deviation": 47.08919652262402
|
||||
}
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rtGetNaN.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 54.38921117782593,
|
||||
"cbmc_time": 0.05220293998718262,
|
||||
"total_time": 54.44276213645935,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rtGetNaN__dee5911b_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20250925_150116.c",
|
||||
"base_name": "rtGetNaN",
|
||||
"timestamp": "20250925_150116",
|
||||
"slug": "dee5911b"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rtGetNaN_1d9b1f90\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 3,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rt_nonfinite.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 57.15380096435547,
|
||||
"cbmc_time": 0.04319405555725098,
|
||||
"total_time": 57.197957277297974,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rt_nonfinite__02d9e270_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20250925_150119.c",
|
||||
"base_name": "rt_nonfinite",
|
||||
"timestamp": "20250925_150119",
|
||||
"slug": "02d9e270"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rt_nonfinite_817adf67\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 4,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rtGetInf.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 68.52063775062561,
|
||||
"cbmc_time": 0.04804491996765137,
|
||||
"total_time": 68.56942963600159,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rtGetInf__12decf94_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20250925_150130.c",
|
||||
"base_name": "rtGetInf",
|
||||
"timestamp": "20250925_150130",
|
||||
"slug": "12decf94"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rtGetInf_4735b761\nfile /tmp/cbmc_m2rzg77p/rtGetInf_4735b761.c line 73 function rtGetInf: function '__CPROVER_isnormal' is not declared\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 3,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/main.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 78.524409532547,
|
||||
"cbmc_time": 0.03157854080200195,
|
||||
"total_time": 78.55790185928345,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/main__f16070c3_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20250925_150140.c",
|
||||
"base_name": "main",
|
||||
"timestamp": "20250925_150140",
|
||||
"slug": "f16070c3"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nfile /tmp/cbmc_wwuwk42w/main_0da782ec.c line 14: /tmp/cbmc_wwuwk42w/main_0da782ec.c:14:10: fatal error: MPC5646C.h: 没有那个文件或目录\n 14 | #include \"MPC5646C.h\"\n | ^~~~~~~~~~~~\ncompilation terminated.\nGCC preprocessing failed\nPARSING ERROR\n",
|
||||
"header_files_processed": 6,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/WindModeltestfinal_data.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 106.7560555934906,
|
||||
"cbmc_time": 0.062186241149902344,
|
||||
"total_time": 106.81890821456909,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/WindModeltestfinal_data__b6221792_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20250925_150208.c",
|
||||
"base_name": "WindModeltestfinal_data",
|
||||
"timestamp": "20250925_150208",
|
||||
"slug": "b6221792"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nfile /tmp/cbmc_mw893uc4/WindModeltestfinal_data_8c401d52.c line 155: syntax error before '.'\nPARSING ERROR\n",
|
||||
"header_files_processed": 7,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/WindModeltestfinal.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 178.70302271842957,
|
||||
"cbmc_time": 0.04708743095397949,
|
||||
"total_time": 178.75100374221802,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/WindModeltestfinal__d3b72bcf_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20250925_150320.c",
|
||||
"base_name": "WindModeltestfinal",
|
||||
"timestamp": "20250925_150320",
|
||||
"slug": "d3b72bcf"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nfile /tmp/cbmc_g19e8mvg/WindModeltestfinal_30498afc.c line 308: /tmp/cbmc_g19e8mvg/WindModeltestfinal_30498afc.c:308:3: error: unterminated comment\n 308 | /* Switch: '<S10>/Switch' incorporates:\n | ^\nGCC preprocessing failed\nPARSING ERROR\n",
|
||||
"header_files_processed": 7,
|
||||
"header_resolution_time": 0.0
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,176 @@
|
||||
{
|
||||
"batch_id": "20251001_000809",
|
||||
"start_time": "2025-10-01T00:08:09.967531",
|
||||
"end_time": "2025-10-01T00:10:25.130715",
|
||||
"total_duration": 135.163184,
|
||||
"statistics": {
|
||||
"total_files": 6,
|
||||
"successful_files": 6,
|
||||
"failed_files": 0,
|
||||
"api_failures": 0,
|
||||
"cbmc_failures": 0,
|
||||
"internal_errors": 0,
|
||||
"success_rate": 100.0,
|
||||
"average_processing_time": 135.1529153585434,
|
||||
"average_api_time": 135.02583901087442,
|
||||
"average_cbmc_time": 0.12001748879750569,
|
||||
"total_processing_time": 810.9174921512604,
|
||||
"total_api_time": 810.1550340652466,
|
||||
"total_cbmc_time": 0.7201049327850342,
|
||||
"min_processing_time": 135.1500382423401,
|
||||
"max_processing_time": 135.1575767993927,
|
||||
"file_size_stats": {
|
||||
"average_size_bytes": 4423.166666666667,
|
||||
"min_size_bytes": 2186,
|
||||
"max_size_bytes": 13559,
|
||||
"total_size_bytes": 26539
|
||||
},
|
||||
"total_header_files_processed": 30,
|
||||
"average_header_files_per_file": 5.0,
|
||||
"total_header_resolution_time": 0.0,
|
||||
"average_header_resolution_time": 0.0,
|
||||
"files_with_headers": 6,
|
||||
"header_processing_efficiency": 0.0
|
||||
},
|
||||
"error_summary": {
|
||||
"status_counts": {},
|
||||
"error_message_counts": {},
|
||||
"non_critical_errors": {
|
||||
"Other Dependencies": [
|
||||
"the program has no entry point",
|
||||
"the program has no entry point",
|
||||
"the program has no entry point",
|
||||
"the program has no entry point",
|
||||
"the program has no entry point",
|
||||
"the program has no entry point"
|
||||
]
|
||||
}
|
||||
},
|
||||
"performance_metrics": {
|
||||
"throughput_files_per_hour": 26.63649533899924,
|
||||
"api_efficiency": 0.9990597587382274,
|
||||
"parallel_efficiency_estimate": 5.999665343642682,
|
||||
"total_header_files_processed": 30,
|
||||
"files_with_header_dependencies": 6,
|
||||
"header_dependency_coverage": 100.0,
|
||||
"average_header_resolution_time": 0.0,
|
||||
"total_header_resolution_time": 0.0,
|
||||
"header_processing_overhead": 0.0,
|
||||
"time_distribution": {
|
||||
"fastest_file_time": 135.1500382423401,
|
||||
"slowest_file_time": 135.1575767993927,
|
||||
"median_time": 135.1517025232315,
|
||||
"std_deviation": 0.0031716448939663722
|
||||
}
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rtGetInf.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 135.02666878700256,
|
||||
"cbmc_time": 0.11559152603149414,
|
||||
"total_time": 135.1500382423401,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rtGetInf__12decf94_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20251001_001025.c",
|
||||
"base_name": "rtGetInf",
|
||||
"timestamp": "20251001_001025",
|
||||
"slug": "12decf94"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rtGetInf_b8eedfd6\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 3,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rt_nonfinite.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 135.02596473693848,
|
||||
"cbmc_time": 0.11397862434387207,
|
||||
"total_time": 135.15036869049072,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rt_nonfinite__02d9e270_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20251001_001025.c",
|
||||
"base_name": "rt_nonfinite",
|
||||
"timestamp": "20251001_001025",
|
||||
"slug": "02d9e270"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rt_nonfinite_422b4908\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 4,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/main.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 135.02161169052124,
|
||||
"cbmc_time": 0.12755799293518066,
|
||||
"total_time": 135.1522936820984,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/main__f16070c3_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20251001_001024.c",
|
||||
"base_name": "main",
|
||||
"timestamp": "20251001_001024",
|
||||
"slug": "f16070c3"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking main_3029acd2\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 6,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/WindModeltestfinal_data.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 135.02881026268005,
|
||||
"cbmc_time": 0.1207437515258789,
|
||||
"total_time": 135.15610337257385,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/WindModeltestfinal_data__b6221792_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20251001_001024.c",
|
||||
"base_name": "WindModeltestfinal_data",
|
||||
"timestamp": "20251001_001024",
|
||||
"slug": "b6221792"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking WindModeltestfinal_data_3c9ecd13\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 7,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/rtGetNaN.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 135.02343249320984,
|
||||
"cbmc_time": 0.11685562133789062,
|
||||
"total_time": 135.15111136436462,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/rtGetNaN__dee5911b_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20251001_001025.c",
|
||||
"base_name": "rtGetNaN",
|
||||
"timestamp": "20251001_001025",
|
||||
"slug": "dee5911b"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking rtGetNaN_15342e50\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 3,
|
||||
"header_resolution_time": 0.0
|
||||
},
|
||||
{
|
||||
"file_path": "testfiles/windmodel/WindModeltestfinal.c",
|
||||
"status": "SUCCESS",
|
||||
"api_time": 135.0285460948944,
|
||||
"cbmc_time": 0.12537741661071777,
|
||||
"total_time": 135.1575767993927,
|
||||
"error_message": "",
|
||||
"output_files": {
|
||||
"original": "output/test_output_fixed_detection/original_code/WindModeltestfinal__d3b72bcf_original.c",
|
||||
"generated": "output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20251001_001024.c",
|
||||
"base_name": "WindModeltestfinal",
|
||||
"timestamp": "20251001_001024",
|
||||
"slug": "d3b72bcf"
|
||||
},
|
||||
"verification_result": "CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux\nType-checking WindModeltestfinal_0d6534b2\nGenerating GOTO Program\nAdding CPROVER library (x86_64)\nRemoval of function pointers and virtual functions\nGeneric Property Instrumentation\nStarting Bounded Model Checking\nthe program has no entry point\n",
|
||||
"header_files_processed": 7,
|
||||
"header_resolution_time": 0.0
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -0,0 +1,315 @@
|
||||
```c
|
||||
/*
|
||||
* WindModeltestfinal.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
#include "WindModeltestfinal.h"
|
||||
#include "WindModeltestfinal_private.h"
|
||||
#include<string.h>
|
||||
/* Block states (default storage) */
|
||||
DW_WindModeltestfinal_T WindModeltestfinal_DW;
|
||||
|
||||
/* External inputs (root inport signals with default storage) */
|
||||
ExtU_WindModeltestfinal_T WindModeltestfinal_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with default storage) */
|
||||
ExtY_WindModeltestfinal_T WindModeltestfinal_Y;
|
||||
|
||||
/* Real-time model */
|
||||
static RT_MODEL_WindModeltestfinal_T WindModeltestfinal_M_;
|
||||
RT_MODEL_WindModeltestfinal_T *const WindModeltestfinal_M =
|
||||
&WindModeltestfinal_M_;
|
||||
|
||||
/* Model step function */
|
||||
void WindModeltestfinal_step(void)
|
||||
{
|
||||
float rtb_Sum_c;
|
||||
int32_T tmp;
|
||||
int32_T tmp_0;
|
||||
int32_T tmp_1;
|
||||
int32_T tmp_2;
|
||||
int32_T tmp_3;
|
||||
boolean_T rtb_LogicalOperator_f;
|
||||
boolean_T rtb_Switch_i;
|
||||
|
||||
/* Precondition assumptions for input validation */
|
||||
__CPROVER_assume(WindModeltestfinal_U.DuConfig >= 0 && WindModeltestfinal_U.DuConfig <= INT32_MAX);
|
||||
__CPROVER_assume(WindModeltestfinal_U.PFDActiveMenu >= 0 && WindModeltestfinal_U.PFDActiveMenu <= INT32_MAX);
|
||||
__CPROVER_assume(WindModeltestfinal_U.MFDActiveLowerMenu >= 0 && WindModeltestfinal_U.MFDActiveLowerMenu <= INT32_MAX);
|
||||
__CPROVER_assume(WindModeltestfinal_U.MFDMode2 >= 0 && WindModeltestfinal_U.MFDMode2 <= INT32_MAX);
|
||||
__CPROVER_assume(WindModeltestfinal_U.TrueRefHeadingIsValid == 0 || WindModeltestfinal_U.TrueRefHeadingIsValid == 1);
|
||||
__CPROVER_assume(WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid == 0 || WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid == 1);
|
||||
__CPROVER_assume(WindModeltestfinal_U.WindSpeedFMSSideIsValid == 0 || WindModeltestfinal_U.WindSpeedFMSSideIsValid == 1);
|
||||
__CPROVER_assume(WindModeltestfinal_U.UnusualAttitude == 0 || WindModeltestfinal_U.UnusualAttitude == 1);
|
||||
__CPROVER_assume(!isnan(WindModeltestfinal_U.TrueRefHeading) && !isinf(WindModeltestfinal_U.TrueRefHeading));
|
||||
__CPROVER_assume(!isnan(WindModeltestfinal_U.WindDirectionTrueFMSSide) && !isinf(WindModeltestfinal_U.WindDirectionTrueFMSSide));
|
||||
__CPROVER_assume(!isnan(WindModeltestfinal_U.WindSpeedFMSSide) && !isinf(WindModeltestfinal_U.WindSpeedFMSSide));
|
||||
__CPROVER_assume(WindModeltestfinal_U.FMSColor >= 0 && WindModeltestfinal_U.FMSColor <= INT32_MAX);
|
||||
|
||||
/* Switch: '<S6>/Switch' incorporates:
|
||||
* Constant: '<S1>/WindSpeedMinC'
|
||||
* Constant: '<S1>/WindSpeedUpperHystC'
|
||||
* Inport: '<Root>/WindSpeedFMSSide'
|
||||
* Memory: '<S6>/Memory'
|
||||
* RelationalOperator: '<S6>/Relational Operator'
|
||||
* RelationalOperator: '<S6>/Relational Operator1'
|
||||
*/
|
||||
/*
|
||||
if (WindModeltestfinal_DW.Memory_PreviousInput) {
|
||||
rtb_Switch_i = (WindModeltestfinal_U.WindSpeedFMSSide >=
|
||||
WindModeltestfinal_P.WindSpeedMinC_Value);
|
||||
} else {
|
||||
rtb_Switch_i = (WindModeltestfinal_U.WindSpeedFMSSide >
|
||||
WindModeltestfinal_P.WindSpeedUpperHystC_Value);
|
||||
}
|
||||
* */
|
||||
|
||||
|
||||
/* End of Switch: '<S6>/Switch' */
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator1' incorporates:
|
||||
* Inport: '<Root>/DuConfig'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.DuConfig;
|
||||
if (WindModeltestfinal_U.DuConfig < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_3 >= 0 && tmp_3 <= INT32_MAX, "DuConfig bounds check");
|
||||
|
||||
/* Switch: '<S3>/Switch' incorporates:
|
||||
* Constant: '<S3>/AFDConfigurationType PFD'
|
||||
* Constant: '<S3>/MFDMenuType'
|
||||
* Constant: '<S3>/MFDModeType = PLAN'
|
||||
* Constant: '<S3>/MFDModeType = TCAS'
|
||||
* Constant: '<S3>/MFDModeType= BLANK'
|
||||
* Constant: '<S3>/MFDModeType=PPSN'
|
||||
* Constant: '<S3>/PFDMenuType'
|
||||
* Inport: '<Root>/TrueRefHeadingIsValid'
|
||||
* Inport: '<Root>/UnusualAttitude'
|
||||
* Inport: '<Root>/WindDirectionTrueFMSSideIsValid'
|
||||
* Inport: '<Root>/WindSpeedFMSSideIsValid'
|
||||
* Logic: '<S3>/Logical Operator'
|
||||
* Logic: '<S3>/Logical Operator1'
|
||||
* Logic: '<S3>/Logical Operator2'
|
||||
* Logic: '<S3>/Logical Operator3'
|
||||
* Logic: '<S3>/Logical Operator4'
|
||||
* RelationalOperator: '<S3>/Relational Operator'
|
||||
* RelationalOperator: '<S3>/Relational Operator1'
|
||||
* RelationalOperator: '<S3>/Relational Operator2'
|
||||
* RelationalOperator: '<S3>/Relational Operator3'
|
||||
* RelationalOperator: '<S3>/Relational Operator4'
|
||||
* RelationalOperator: '<S3>/Relational Operator5'
|
||||
* RelationalOperator: '<S3>/Relational Operator6'
|
||||
*/
|
||||
if ((uint32_T)tmp_3 == WindModeltestfinal_P.AFDConfigurationTypePFD_Value) {
|
||||
/* RelationalOperator: '<S3>/Relational Operator' incorporates:
|
||||
* Inport: '<Root>/PFDActiveMenu'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.PFDActiveMenu;
|
||||
if (WindModeltestfinal_U.PFDActiveMenu < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_3 >= 0 && tmp_3 <= INT32_MAX, "PFDActiveMenu bounds check");
|
||||
|
||||
rtb_LogicalOperator_f = ((WindModeltestfinal_U.TrueRefHeadingIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindSpeedFMSSideIsValid != 0) &&
|
||||
(WindModeltestfinal_U.UnusualAttitude == 0) && ((uint32_T)tmp_3 ==
|
||||
WindModeltestfinal_P.PFDMenuType_Value));
|
||||
} else {
|
||||
/* RelationalOperator: '<S3>/Relational Operator2' incorporates:
|
||||
* Inport: '<Root>/MFDActiveLowerMenu'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.MFDActiveLowerMenu;
|
||||
if (WindModeltestfinal_U.MFDActiveLowerMenu < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_3 >= 0 && tmp_3 <= INT32_MAX, "MFDActiveLowerMenu bounds check");
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator3' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp >= 0 && tmp <= INT32_MAX, "MFDMode2 bounds check 1");
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator4' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_0 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_0 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_0 >= 0 && tmp_0 <= INT32_MAX, "MFDMode2 bounds check 2");
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator5' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_1 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_1 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_1 >= 0 && tmp_1 <= INT32_MAX, "MFDMode2 bounds check 3");
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator6' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_2 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_2 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_2 >= 0 && tmp_2 <= INT32_MAX, "MFDMode2 bounds check 4");
|
||||
|
||||
rtb_LogicalOperator_f = ((WindModeltestfinal_U.WindSpeedFMSSideIsValid != 0)
|
||||
&& ((WindModeltestfinal_U.TrueRefHeadingIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid != 0)) &&
|
||||
((uint32_T)tmp_3 == WindModeltestfinal_P.MFDMenuType_Value) && (((uint32_T)
|
||||
tmp == WindModeltestfinal_P.MFDModeTypeBLANK_Value) || ((uint32_T)tmp_0 ==
|
||||
WindModeltestfinal_P.MFDModeTypePPSN_Value) || ((uint32_T)tmp_1 ==
|
||||
WindModeltestfinal_P.MFDModeTypePLAN_Value) || ((uint32_T)tmp_2 ==
|
||||
WindModeltestfinal_P.MFDModeTypeTCAS_Value)));
|
||||
}
|
||||
|
||||
/* End of Switch: '<S3>/Switch' */
|
||||
|
||||
/* Logic: '<S6>/Logical Operator' incorporates:
|
||||
* DataTypeConversion: '<S3>/Data Type Conversion'
|
||||
*/
|
||||
rtb_LogicalOperator_f = (rtb_Switch_i && rtb_LogicalOperator_f);
|
||||
|
||||
/* Outport: '<Root>/WindVisible' incorporates:
|
||||
* DataTypeConversion: '<S2>/Data Type Conversion'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindVisible = rtb_LogicalOperator_f;
|
||||
__CPROVER_assert(WindModeltestfinal_Y.WindVisible == 0 || WindModeltestfinal_Y.WindVisible == 1, "WindVisible boolean check");
|
||||
|
||||
/* Sum: '<S7>/Sum' incorporates:
|
||||
* Inport: '<Root>/TrueRefHeading'
|
||||
* Inport: '<Root>/WindDirectionTrueFMSSide'
|
||||
*/
|
||||
rtb_Sum_c = WindModeltestfinal_U.WindDirectionTrueFMSSide -
|
||||
WindModeltestfinal_U.TrueRefHeading;
|
||||
__CPROVER_assert(!isnan(rtb_Sum_c) && !isinf(rtb_Sum_c), "Angle difference overflow check");
|
||||
|
||||
/* Switch: '<S7>/Switch' incorporates:
|
||||
* Abs: '<S7>/Abs'
|
||||
* Constant: '<S7>/180'
|
||||
* RelationalOperator: '<S7>/Relational Operator'
|
||||
*/
|
||||
if (!(fabs(rtb_Sum_c) <= WindModeltestfinal_P.u80_Value)) {
|
||||
/* Switch: '<S7>/Switch1' incorporates:
|
||||
* Constant: '<S7>/0'
|
||||
* Constant: '<S7>/360'
|
||||
* Constant: '<S7>/360 '
|
||||
* RelationalOperator: '<S7>/Relational Operator1'
|
||||
* Sum: '<S7>/Sum1'
|
||||
* Sum: '<S7>/Sum2'
|
||||
*/
|
||||
if (rtb_Sum_c > WindModeltestfinal_P.u_Value) {
|
||||
rtb_Sum_c -= WindModeltestfinal_P.u60_Value;
|
||||
} else {
|
||||
rtb_Sum_c += WindModeltestfinal_P.u60_Value_c;
|
||||
}
|
||||
__CPROVER_assert(!isnan(rtb_Sum_c) && !isinf(rtb_Sum_c), "Angle normalization overflow check");
|
||||
|
||||
/* End of Switch: '<S7>/Switch1' */
|
||||
}
|
||||
|
||||
/* End of Switch: '<S7>/Switch' */
|
||||
|
||||
/* Sum: '<S8>/Sum' incorporates:
|
||||
* Constant: '<S4>/Constant'
|
||||
*/
|
||||
rtb_Sum_c -= WindModeltestfinal_P.Constant_Value;
|
||||
__CPROVER_assert(!isnan(rtb_Sum_c) && !isinf(rtb_Sum_c), "Angle adjustment overflow check");
|
||||
|
||||
/* Switch: '<S8>/Switch' incorporates:
|
||||
* Abs: '<S8>/Abs'
|
||||
* Constant: '<S8>/180'
|
||||
* RelationalOperator: '<S8>/Relational Operator'
|
||||
*/
|
||||
if (!(fabs(rtb_Sum_c) <= WindModeltestfinal_P.u80_Value_e)) {
|
||||
/* Switch: '<S8>/Switch1' incorporates:
|
||||
* Constant: '<S8>/0'
|
||||
* Constant: '<S8>/360'
|
||||
* Constant: '<S8>/360 '
|
||||
* RelationalOperator: '<S8>/Relational Operator1'
|
||||
* Sum: '<S8>/Sum1'
|
||||
* Sum: '<S8>/Sum2'
|
||||
*/
|
||||
if (rtb_Sum_c > WindModeltestfinal_P.u_Value_l) {
|
||||
rtb_Sum_c -= WindModeltestfinal_P.u60_Value_g;
|
||||
} else {
|
||||
rtb_Sum_c += WindModeltestfinal_P.u60_Value_e;
|
||||
}
|
||||
__CPROVER_assert(!isnan(rtb_Sum_c) && !isinf(rtb_Sum_c), "Second angle normalization overflow check");
|
||||
|
||||
/* End of Switch: '<S8>/Switch1' */
|
||||
}
|
||||
|
||||
/* End of Switch: '<S8>/Switch' */
|
||||
|
||||
/* Switch: '<S9>/Switch' incorporates:
|
||||
* Constant: '<S9>/0 double'
|
||||
* RelationalOperator: '<S9>/Relational Operator'
|
||||
*/
|
||||
if (rtb_Sum_c >= WindModeltestfinal_P.udouble_Value) {
|
||||
/* Outport: '<Root>/WindDirection' incorporates:
|
||||
* Abs: '<S9>/Abs'
|
||||
* Constant: '<S1>/WindDirectionResC'
|
||||
* Constant: '<S9>/0.5 double'
|
||||
* Product: '<S9>/Divide'
|
||||
* Product: '<S9>/Product'
|
||||
* Rounding: '<S9>/Rounding Function'
|
||||
* Sum: '<S9>/Sum'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindDirection = floor(fabs(rtb_Sum_c /
|
||||
WindModeltestfinal_P.WindDirectionResC_Value) +
|
||||
WindModeltestfinal_P.u5double_Value) *
|
||||
WindModeltestfinal_P.WindDirectionResC_Value;
|
||||
} else {
|
||||
/* Outport: '<Root>/WindDirection' incorporates:
|
||||
* Abs: '<S9>/Abs'
|
||||
* Constant: '<S1>/WindDirectionResC'
|
||||
* Constant: '<S9>/0.5 double'
|
||||
* Product: '<S9>/Divide'
|
||||
* Product: '<S9>/Product'
|
||||
* Rounding: '<S9>/Rounding Function'
|
||||
* Sum: '<S9>/Sum'
|
||||
* UnaryMinus: '<S9>/Unary Minus'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindDirection = -(floor(fabs(rtb_Sum_c /
|
||||
WindModeltestfinal_P.WindDirectionResC_Value) +
|
||||
WindModeltestfinal_P.u5double_Value) *
|
||||
WindModeltestfinal_P.WindDirectionResC_Value);
|
||||
}
|
||||
__CPROVER_assert(!isnan(WindModeltestfinal_Y.WindDirection) && !isinf(WindModeltestfinal_Y.WindDirection), "WindDirection finite check");
|
||||
|
||||
/* End of Switch: '<S9>/Switch' */
|
||||
|
||||
/* Switch: '<S10>/Switch' incorporates:
|
||||
* Abs: '<S10>/Abs'
|
||||
* Constant: '<S10>/0 double'
|
||||
* Constant: '<S10>/0.5 double'
|
||||
* Constant: '<S1>/WindSpeedResC'
|
||||
* Inport: '<Root>/WindSpeedFMSSide'
|
||||
* Product: '<S10>/Divide'
|
||||
* Product: '<S10>/Product'
|
||||
* RelationalOperator: '<S10>/Relational Operator'
|
||||
* Rounding: '<S10>/Rounding Function'
|
||||
* Sum: '<S10>/Sum'
|
||||
* UnaryMinus: '<S
|
||||
@ -0,0 +1,317 @@
|
||||
```c
|
||||
/*
|
||||
* WindModeltestfinal.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
#include "WindModeltestfinal.h"
|
||||
#include "WindModeltestfinal_private.h"
|
||||
#include<string.h>
|
||||
/* Block states (default storage) */
|
||||
DW_WindModeltestfinal_T WindModeltestfinal_DW;
|
||||
|
||||
/* External inputs (root inport signals with default storage) */
|
||||
ExtU_WindModeltestfinal_T WindModeltestfinal_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with default storage) */
|
||||
ExtY_WindModeltestfinal_T WindModeltestfinal_Y;
|
||||
|
||||
/* Real-time model */
|
||||
static RT_MODEL_WindModeltestfinal_T WindModeltestfinal_M_;
|
||||
RT_MODEL_WindModeltestfinal_T *const WindModeltestfinal_M =
|
||||
&WindModeltestfinal_M_;
|
||||
|
||||
/* Model step function */
|
||||
void WindModeltestfinal_step(void)
|
||||
{
|
||||
float rtb_Sum_c;
|
||||
int32_T tmp;
|
||||
int32_T tmp_0;
|
||||
int32_T tmp_1;
|
||||
int32_T tmp_2;
|
||||
int32_T tmp_3;
|
||||
boolean_T rtb_LogicalOperator_f;
|
||||
boolean_T rtb_Switch_i;
|
||||
|
||||
/* Precondition assumptions for input validation */
|
||||
__CPROVER_assume(WindModeltestfinal_U.DuConfig >= -1000000 && WindModeltestfinal_U.DuConfig <= 1000000);
|
||||
__CPROVER_assume(WindModeltestfinal_U.PFDActiveMenu >= -1000000 && WindModeltestfinal_U.PFDActiveMenu <= 1000000);
|
||||
__CPROVER_assume(WindModeltestfinal_U.MFDActiveLowerMenu >= -1000000 && WindModeltestfinal_U.MFDActiveLowerMenu <= 1000000);
|
||||
__CPROVER_assume(WindModeltestfinal_U.MFDMode2 >= -1000000 && WindModeltestfinal_U.MFDMode2 <= 1000000);
|
||||
__CPROVER_assume(!__builtin_isnan(WindModeltestfinal_U.TrueRefHeading));
|
||||
__CPROVER_assume(!__builtin_isnan(WindModeltestfinal_U.WindDirectionTrueFMSSide));
|
||||
__CPROVER_assume(!__builtin_isnan(WindModeltestfinal_U.WindSpeedFMSSide));
|
||||
__CPROVER_assume(WindModeltestfinal_U.TrueRefHeadingIsValid == 0 || WindModeltestfinal_U.TrueRefHeadingIsValid == 1);
|
||||
__CPROVER_assume(WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid == 0 || WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid == 1);
|
||||
__CPROVER_assume(WindModeltestfinal_U.WindSpeedFMSSideIsValid == 0 || WindModeltestfinal_U.WindSpeedFMSSideIsValid == 1);
|
||||
__CPROVER_assume(WindModeltestfinal_U.UnusualAttitude == 0 || WindModeltestfinal_U.UnusualAttitude == 1);
|
||||
__CPROVER_assume(WindModeltestfinal_U.FMSColor >= -1000000 && WindModeltestfinal_U.FMSColor <= 1000000);
|
||||
|
||||
/* Switch: '<S6>/Switch' incorporates:
|
||||
* Constant: '<S1>/WindSpeedMinC'
|
||||
* Constant: '<S1>/WindSpeedUpperHystC'
|
||||
* Inport: '<Root>/WindSpeedFMSSide'
|
||||
* Memory: '<S6>/Memory'
|
||||
* RelationalOperator: '<S6>/Relational Operator'
|
||||
* RelationalOperator: '<S6>/Relational Operator1'
|
||||
*/
|
||||
/*
|
||||
if (WindModeltestfinal_DW.Memory_PreviousInput) {
|
||||
rtb_Switch_i = (WindModeltestfinal_U.WindSpeedFMSSide >=
|
||||
WindModeltestfinal_P.WindSpeedMinC_Value);
|
||||
} else {
|
||||
rtb_Switch_i = (WindModeltestfinal_U.WindSpeedFMSSide >
|
||||
WindModeltestfinal_P.WindSpeedUpperHystC_Value);
|
||||
}
|
||||
* */
|
||||
|
||||
|
||||
/* End of Switch: '<S6>/Switch' */
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator1' incorporates:
|
||||
* Inport: '<Root>/DuConfig'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.DuConfig;
|
||||
if (WindModeltestfinal_U.DuConfig < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_3 >= 0, "DuConfig bounds after negative check");
|
||||
|
||||
/* Switch: '<S3>/Switch' incorporates:
|
||||
* Constant: '<S3>/AFDConfigurationType PFD'
|
||||
* Constant: '<S3>/MFDMenuType'
|
||||
* Constant: '<S3>/MFDModeType = PLAN'
|
||||
* Constant: '<S3>/MFDModeType = TCAS'
|
||||
* Constant: '<S3>/MFDModeType= BLANK'
|
||||
* Constant: '<S3>/MFDModeType=PPSN'
|
||||
* Inport: '<Root>/TrueRefHeadingIsValid'
|
||||
* Inport: '<Root>/UnusualAttitude'
|
||||
* Inport: '<Root>/WindDirectionTrueFMSSideIsValid'
|
||||
* Inport: '<Root>/WindSpeedFMSSideIsValid'
|
||||
* Logic: '<S3>/Logical Operator'
|
||||
* Logic: '<S3>/Logical Operator1'
|
||||
* Logic: '<S3>/Logical Operator2'
|
||||
* Logic: '<S3>/Logical Operator3'
|
||||
* Logic: '<S3>/Logical Operator4'
|
||||
* RelationalOperator: '<S3>/Relational Operator'
|
||||
* RelationalOperator: '<S3>/Relational Operator1'
|
||||
* RelationalOperator: '<S3>/Relational Operator2'
|
||||
* RelationalOperator: '<S3>/Relational Operator3'
|
||||
* RelationalOperator: '<S3>/Relational Operator4'
|
||||
* RelationalOperator: '<S3>/Relational Operator5'
|
||||
* RelationalOperator: '<S3>/Relational Operator6'
|
||||
*/
|
||||
if ((uint32_T)tmp_3 == WindModeltestfinal_P.AFDConfigurationTypePFD_Value) {
|
||||
/* RelationalOperator: '<S3>/Relational Operator' incorporates:
|
||||
* Inport: '<Root>/PFDActiveMenu'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.PFDActiveMenu;
|
||||
if (WindModeltestfinal_U.PFDActiveMenu < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_3 >= 0, "PFDActiveMenu bounds after negative check");
|
||||
|
||||
rtb_LogicalOperator_f = ((WindModeltestfinal_U.TrueRefHeadingIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindSpeedFMSSideIsValid != 0) &&
|
||||
(WindModeltestfinal_U.UnusualAttitude == 0) && ((uint32_T)tmp_3 ==
|
||||
WindModeltestfinal_P.PFDMenuType_Value));
|
||||
} else {
|
||||
/* RelationalOperator: '<S3>/Relational Operator2' incorporates:
|
||||
* Inport: '<Root>/MFDActiveLowerMenu'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.MFDActiveLowerMenu;
|
||||
if (WindModeltestfinal_U.MFDActiveLowerMenu < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_3 >= 0, "MFDActiveLowerMenu bounds after negative check");
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator3' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp >= 0, "MFDMode2 bounds after negative check");
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator4' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_0 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_0 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_0 >= 0, "MFDMode2 bounds after negative check");
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator5' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_1 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_1 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_1 >= 0, "MFDMode2 bounds after negative check");
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator6' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_2 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_2 = 0;
|
||||
}
|
||||
__CPROVER_assert(tmp_2 >= 0, "MFDMode2 bounds after negative check");
|
||||
|
||||
rtb_LogicalOperator_f = ((WindModeltestfinal_U.WindSpeedFMSSideIsValid != 0)
|
||||
&& ((WindModeltestfinal_U.TrueRefHeadingIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid != 0)) &&
|
||||
((uint32_T)tmp_3 == WindModeltestfinal_P.MFDMenuType_Value) && (((uint32_T)
|
||||
tmp == WindModeltestfinal_P.MFDModeTypeBLANK_Value) || ((uint32_T)tmp_0 ==
|
||||
WindModeltestfinal_P.MFDModeTypePPSN_Value) || ((uint32_T)tmp_1 ==
|
||||
WindModeltestfinal_P.MFDModeTypePLAN_Value) || ((uint32_T)tmp_2 ==
|
||||
WindModeltestfinal_P.MFDModeTypeTCAS_Value)));
|
||||
}
|
||||
|
||||
/* End of Switch: '<S3>/Switch' */
|
||||
|
||||
/* Logic: '<S6>/Logical Operator' incorporates:
|
||||
* DataTypeConversion: '<S3>/Data Type Conversion'
|
||||
*/
|
||||
rtb_LogicalOperator_f = (rtb_Switch_i && rtb_LogicalOperator_f);
|
||||
|
||||
/* Outport: '<Root>/WindVisible' incorporates:
|
||||
* DataTypeConversion: '<S2>/Data Type Conversion'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindVisible = rtb_LogicalOperator_f;
|
||||
__CPROVER_assert(WindModeltestfinal_Y.WindVisible == 0 || WindModeltestfinal_Y.WindVisible == 1, "WindVisible boolean bounds");
|
||||
|
||||
/* Sum: '<S7>/Sum' incorporates:
|
||||
* Inport: '<Root>/TrueRefHeading'
|
||||
* Inport: '<Root>/WindDirectionTrueFMSSide'
|
||||
*/
|
||||
rtb_Sum_c = WindModeltestfinal_U.WindDirectionTrueFMSSide -
|
||||
WindModeltestfinal_U.TrueRefHeading;
|
||||
__CPROVER_assert(!__builtin_isnan(rtb_Sum_c), "Sum result is not NaN");
|
||||
|
||||
/* Switch: '<S7>/Switch' incorporates:
|
||||
* Abs: '<S7>/Abs'
|
||||
* Constant: '<S7>/180'
|
||||
* RelationalOperator: '<S7>/Relational Operator'
|
||||
*/
|
||||
if (!(fabs(rtb_Sum_c) <= WindModeltestfinal_P.u80_Value)) {
|
||||
/* Switch: '<S7>/Switch1' incorporates:
|
||||
* Constant: '<S7>/0'
|
||||
* Constant: '<S7>/360'
|
||||
* Constant: '<S7>/360 '
|
||||
* RelationalOperator: '<S7>/Relational Operator1'
|
||||
* Sum: '<S7>/Sum1'
|
||||
* Sum: '<S7>/Sum2'
|
||||
*/
|
||||
if (rtb_Sum_c > WindModeltestfinal_P.u_Value) {
|
||||
rtb_Sum_c -= WindModeltestfinal_P.u60_Value;
|
||||
__CPROVER_assert(!__builtin_isnan(rtb_Sum_c), "Subtraction result is not NaN");
|
||||
} else {
|
||||
rtb_Sum_c += WindModeltestfinal_P.u60_Value_c;
|
||||
__CPROVER_assert(!__builtin_isnan(rtb_Sum_c), "Addition result is not NaN");
|
||||
}
|
||||
|
||||
/* End of Switch: '<S7>/Switch1' */
|
||||
}
|
||||
|
||||
/* End of Switch: '<S7>/Switch' */
|
||||
|
||||
/* Sum: '<S8>/Sum' incorporates:
|
||||
* Constant: '<S4>/Constant'
|
||||
*/
|
||||
rtb_Sum_c -= WindModeltestfinal_P.Constant_Value;
|
||||
__CPROVER_assert(!__builtin_isnan(rtb_Sum_c), "Constant subtraction result is not NaN");
|
||||
|
||||
/* Switch: '<S8>/Switch' incorporates:
|
||||
* Abs: '<S8>/Abs'
|
||||
* Constant: '<S8>/180'
|
||||
* RelationalOperator: '<S8>/Relational Operator'
|
||||
*/
|
||||
if (!(fabs(rtb_Sum_c) <= WindModeltestfinal_P.u80_Value_e)) {
|
||||
/* Switch: '<S8>/Switch1' incorporates:
|
||||
* Constant: '<S8>/0'
|
||||
* Constant: '<S8>/360'
|
||||
* Constant: '<S8>/360 '
|
||||
* RelationalOperator: '<S8>/Relational Operator1'
|
||||
* Sum: '<S8>/Sum1'
|
||||
* Sum: '<S8>/Sum2'
|
||||
*/
|
||||
if (rtb_Sum_c > WindModeltestfinal_P.u_Value_l) {
|
||||
rtb_Sum_c -= WindModeltestfinal_P.u60_Value_g;
|
||||
__CPROVER_assert(!__builtin_isnan(rtb_Sum_c), "Subtraction result is not NaN");
|
||||
} else {
|
||||
rtb_Sum_c += WindModeltestfinal_P.u60_Value_e;
|
||||
__CPROVER_assert(!__builtin_isnan(rtb_Sum_c), "Addition result is not NaN");
|
||||
}
|
||||
|
||||
/* End of Switch: '<S8>/Switch1' */
|
||||
}
|
||||
|
||||
/* End of Switch: '<S8>/Switch' */
|
||||
|
||||
/* Switch: '<S9>/Switch' incorporates:
|
||||
* Constant: '<S9>/0 double'
|
||||
* RelationalOperator: '<S9>/Relational Operator'
|
||||
*/
|
||||
if (rtb_Sum_c >= WindModeltestfinal_P.udouble_Value) {
|
||||
/* Outport: '<Root>/WindDirection' incorporates:
|
||||
* Abs: '<S9>/Abs'
|
||||
* Constant: '<S1>/WindDirectionResC'
|
||||
* Constant: '<S9>/0.5 double'
|
||||
* Product: '<S9>/Divide'
|
||||
* Product: '<S9>/Product'
|
||||
* Rounding: '<S9>/Rounding Function'
|
||||
* Sum: '<S9>/Sum'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindDirection = floor(fabs(rtb_Sum_c /
|
||||
WindModeltestfinal_P.WindDirectionResC_Value) +
|
||||
WindModeltestfinal_P.u5double_Value) *
|
||||
WindModeltestfinal_P.WindDirectionResC_Value;
|
||||
__CPROVER_assert(!__builtin_isnan(WindModeltestfinal_Y.WindDirection), "WindDirection calculation result is not NaN");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindDirectionResC_Value != 0, "Division by zero check");
|
||||
} else {
|
||||
/* Outport: '<Root>/WindDirection' incorporates:
|
||||
* Abs: '<S9>/Abs'
|
||||
* Constant: '<S1>/WindDirectionResC'
|
||||
* Constant: '<S9>/0.5 double'
|
||||
* Product: '<S9>/Divide'
|
||||
* Product: '<S9>/Product'
|
||||
* Rounding: '<S9>/Rounding Function'
|
||||
* Sum: '<S9>/Sum'
|
||||
* UnaryMinus: '<S9>/Unary Minus'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindDirection = -(floor(fabs(rtb_Sum_c /
|
||||
WindModeltestfinal_P.WindDirectionResC_Value) +
|
||||
WindModeltestfinal_P.u5double_Value) *
|
||||
WindModeltestfinal_P.WindDirectionResC_Value);
|
||||
__CPROVER_assert(!__builtin_isnan(WindModeltestfinal_Y.WindDirection), "WindDirection calculation result is not NaN");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindDirectionResC_Value != 0, "Division by zero check");
|
||||
}
|
||||
|
||||
/* End of Switch: '<S9>/Switch' */
|
||||
|
||||
/* Switch: '<S10>/Switch' incorporates:
|
||||
* Abs: '<S10>/Abs'
|
||||
* Constant: '<S10>/0 double'
|
||||
* Constant: '<S10>/0.5 double'
|
||||
* Constant: '<S1>/WindSpeedResC'
|
||||
* Inport: '<Root>/WindSpeedFMSSide'
|
||||
* Product: '<S10>/Divide'
|
||||
* Product: '<S10>/Product'
|
||||
* RelationalOperator: '<S10>/Relational Operator'
|
||||
* Rounding: '<S10>/Rounding
|
||||
@ -0,0 +1 @@
|
||||
// Error: API request failed. Please check your API key and network connection.
|
||||
@ -0,0 +1,188 @@
|
||||
/*
|
||||
* WindModeltestfinal_data.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
#include "WindModeltestfinal.h"
|
||||
#include "WindModeltestfinal_private.h"
|
||||
|
||||
/* Block parameters (default storage) */
|
||||
P_WindModeltestfinal_T WindModeltestfinal_P = {
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S7>/360'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 360
|
||||
* Referenced by: '<S7>/360 '
|
||||
*/
|
||||
360.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S7>/0'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S8>/360'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 360
|
||||
* Referenced by: '<S8>/360 '
|
||||
*/
|
||||
360.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S8>/0'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 5
|
||||
* Referenced by: '<S1>/WindSpeedMinC'
|
||||
*/
|
||||
5.0,
|
||||
|
||||
/* Expression: 7
|
||||
* Referenced by: '<S1>/WindSpeedUpperHystC'
|
||||
*/
|
||||
7.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S7>/180'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S4>/Constant'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S8>/180'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 1
|
||||
* Referenced by: '<S1>/WindDirectionResC'
|
||||
*/
|
||||
1.0,
|
||||
|
||||
/* Expression: 0.5
|
||||
* Referenced by: '<S9>/0.5 double'
|
||||
*/
|
||||
0.5,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S9>/0 double'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 255
|
||||
* Referenced by: '<S1>/WindSpeedMaxC'
|
||||
*/
|
||||
255.0,
|
||||
|
||||
/* Expression: 1
|
||||
* Referenced by: '<S1>/WindSpeedResC'
|
||||
*/
|
||||
1.0,
|
||||
|
||||
/* Expression: 0.5
|
||||
* Referenced by: '<S10>/0.5 double'
|
||||
*/
|
||||
0.5,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S10>/0 double'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Computed Parameter: PFDMenuType_Value
|
||||
* Referenced by: '<S3>/PFDMenuType'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypeTCAS_Value
|
||||
* Referenced by: '<S3>/MFDModeType = TCAS'
|
||||
*/
|
||||
3U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypePLAN_Value
|
||||
* Referenced by: '<S3>/MFDModeType = PLAN'
|
||||
*/
|
||||
2U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypePPSN_Value
|
||||
* Referenced by: '<S3>/MFDModeType=PPSN'
|
||||
*/
|
||||
1U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypeBLANK_Value
|
||||
* Referenced by: '<S3>/MFDModeType= BLANK'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: MFDMenuType_Value
|
||||
* Referenced by: '<S3>/MFDMenuType'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: AFDConfigurationTypePFD_Value
|
||||
* Referenced by: '<S3>/AFDConfigurationType PFD'
|
||||
*/
|
||||
1U,
|
||||
|
||||
/* Computed Parameter: Memory_InitialCondition
|
||||
* Referenced by: '<S6>/Memory'
|
||||
*/
|
||||
0
|
||||
};
|
||||
|
||||
/* CBMC Assertions */
|
||||
/* Preconditions and bounds checking for parameter structure */
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedMinC >= 0.0, "WindSpeedMinC non-negative");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedMinC <= 255.0, "WindSpeedMinC <= WindSpeedMaxC");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedUpperHystC >= 0.0, "WindSpeedUpperHystC non-negative");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedUpperHystC <= 255.0, "WindSpeedUpperHystC <= WindSpeedMaxC");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedMaxC >= 0.0, "WindSpeedMaxC non-negative");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedMaxC >= WindModeltestfinal_P.WindSpeedMinC, "WindSpeedMaxC >= WindSpeedMinC");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedResC > 0.0, "WindSpeedResC positive");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindDirectionResC > 0.0, "WindDirectionResC positive");
|
||||
|
||||
/* Angle bounds checking */
|
||||
__CPROVER_assert(WindModeltestfinal_P.Constant_Value_S4 >= 0.0 && WindModeltestfinal_P.Constant_Value_S4 <= 360.0, "Constant angle in valid range");
|
||||
__CPROVER_assert(WindModeltestfinal_P._180_S7 >= 0.0 && WindModeltestfinal_P._180_S7 <= 360.0, "180_S7 angle in valid range");
|
||||
__CPROVER_assert(WindModeltestfinal_P._180_S8 >= 0.0 && WindModeltestfinal_P._180_S8 <= 360.0, "180_S8 angle in valid range");
|
||||
|
||||
/* Unsigned integer bounds checking */
|
||||
__CPROVER_assert(WindModeltestfinal_P.PFDMenuType_Value <= 3, "PFDMenuType within valid enum range");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDModeTypeTCAS_Value <= 3, "MFDModeTypeTCAS within valid enum range");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDModeTypePLAN_Value <= 3, "MFDModeTypePLAN within valid enum range");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDModeTypePPSN_Value <= 3, "MFDModeTypePPSN within valid enum range");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDModeTypeBLANK_Value <= 3, "MFDModeTypeBLANK within valid enum range");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDMenuType_Value <= 3, "MFDMenuType within valid enum range");
|
||||
__CPROVER_assert(WindModeltestfinal_P.AFDConfigurationTypePFD_Value <= 1, "AFDConfigurationTypePFD within valid enum range");
|
||||
|
||||
/* Memory initial condition bounds */
|
||||
__CPROVER_assert(WindModeltestfinal_P.Memory_InitialCondition == 0, "Memory initial condition is zero");
|
||||
|
||||
/* Overflow prevention assumptions for arithmetic operations */
|
||||
__CPROVER_assume(WindModeltestfinal_P.WindSpeedMaxC + WindModeltestfinal_P.WindSpeedResC <= DBL_MAX);
|
||||
__CPROVER_assume(WindModeltestfinal_P.WindSpeedMinC - WindModeltestfinal_P.WindSpeedResC >= -DBL_MAX);
|
||||
__CPROVER_assume(WindModeltestfinal_P._360_S7 + WindModeltestfinal_P._180_S7 <= DBL_MAX);
|
||||
__CPROVER_assume(WindModeltestfinal_P._360_S8 + WindModeltestfinal_P._180_S8 <= DBL_MAX);
|
||||
|
||||
/* Pointer safety - ensure parameter structure is properly initialized */
|
||||
__CPROVER_assert(&WindModeltestfinal_P != NULL, "Parameter structure pointer valid");
|
||||
@ -0,0 +1,190 @@
|
||||
/*
|
||||
* WindModeltestfinal_data.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
#include "WindModeltestfinal.h"
|
||||
#include "WindModeltestfinal_private.h"
|
||||
|
||||
/* Block parameters (default storage) */
|
||||
P_WindModeltestfinal_T WindModeltestfinal_P = {
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S7>/360'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 360
|
||||
* Referenced by: '<S7>/360 '
|
||||
*/
|
||||
360.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S7>/0'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S8>/360'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 360
|
||||
* Referenced by: '<S8>/360 '
|
||||
*/
|
||||
360.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S8>/0'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 5
|
||||
* Referenced by: '<S1>/WindSpeedMinC'
|
||||
*/
|
||||
5.0,
|
||||
|
||||
/* Expression: 7
|
||||
* Referenced by: '<S1>/WindSpeedUpperHystC'
|
||||
*/
|
||||
7.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S7>/180'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S4>/Constant'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S8>/180'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 1
|
||||
* Referenced by: '<S1>/WindDirectionResC'
|
||||
*/
|
||||
1.0,
|
||||
|
||||
/* Expression: 0.5
|
||||
* Referenced by: '<S9>/0.5 double'
|
||||
*/
|
||||
0.5,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S9>/0 double'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 255
|
||||
* Referenced by: '<S1>/WindSpeedMaxC'
|
||||
*/
|
||||
255.0,
|
||||
|
||||
/* Expression: 1
|
||||
* Referenced by: '<S1>/WindSpeedResC'
|
||||
*/
|
||||
1.0,
|
||||
|
||||
/* Expression: 0.5
|
||||
* Referenced by: '<S10>/0.5 double'
|
||||
*/
|
||||
0.5,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S10>/0 double'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Computed Parameter: PFDMenuType_Value
|
||||
* Referenced by: '<S3>/PFDMenuType'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypeTCAS_Value
|
||||
* Referenced by: '<S3>/MFDModeType = TCAS'
|
||||
*/
|
||||
3U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypePLAN_Value
|
||||
* Referenced by: '<S3>/MFDModeType = PLAN'
|
||||
*/
|
||||
2U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypePPSN_Value
|
||||
* Referenced by: '<S3>/MFDModeType=PPSN'
|
||||
*/
|
||||
1U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypeBLANK_Value
|
||||
* Referenced by: '<S3>/MFDModeType= BLANK'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: MFDMenuType_Value
|
||||
* Referenced by: '<S3>/MFDMenuType'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: AFDConfigurationTypePFD_Value
|
||||
* Referenced by: '<S3>/AFDConfigurationType PFD'
|
||||
*/
|
||||
1U,
|
||||
|
||||
/* Computed Parameter: Memory_InitialCondition
|
||||
* Referenced by: '<S6>/Memory'
|
||||
*/
|
||||
0
|
||||
};
|
||||
|
||||
/* CBMC Assertions */
|
||||
/* Preconditions and assumptions */
|
||||
__CPROVER_assume(WindModeltestfinal_P.WindSpeedMinC >= 0.0 && WindModeltestfinal_P.WindSpeedMinC <= 255.0);
|
||||
__CPROVER_assume(WindModeltestfinal_P.WindSpeedUpperHystC >= 0.0 && WindModeltestfinal_P.WindSpeedUpperHystC <= 255.0);
|
||||
__CPROVER_assume(WindModeltestfinal_P.WindSpeedMaxC >= 0.0 && WindModeltestfinal_P.WindSpeedMaxC <= 255.0);
|
||||
__CPROVER_assume(WindModeltestfinal_P.WindSpeedResC > 0.0);
|
||||
__CPROVER_assume(WindModeltestfinal_P.WindDirectionResC > 0.0);
|
||||
|
||||
/* Postconditions and bounds checking */
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedMinC == 5.0, "WindSpeedMinC should be 5.0");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedUpperHystC == 7.0, "WindSpeedUpperHystC should be 7.0");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedMaxC == 255.0, "WindSpeedMaxC should be 255.0");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedResC == 1.0, "WindSpeedResC should be 1.0");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindDirectionResC == 1.0, "WindDirectionResC should be 1.0");
|
||||
|
||||
/* Angle bounds checking */
|
||||
__CPROVER_assert(WindModeltestfinal_P.Constant >= 0.0 && WindModeltestfinal_P.Constant <= 360.0, "Constant angle should be in [0,360]");
|
||||
__CPROVER_assert(WindModeltestfinal_P._180 >= 0.0 && WindModeltestfinal_P._180 <= 360.0, "180 angle should be in [0,360]");
|
||||
|
||||
/* Unsigned integer bounds checking */
|
||||
__CPROVER_assert(WindModeltestfinal_P.PFDMenuType_Value >= 0U, "PFDMenuType_Value should be non-negative");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDModeTypeTCAS_Value >= 0U && WindModeltestfinal_P.MFDModeTypeTCAS_Value <= 3U, "MFDModeTypeTCAS_Value should be in [0,3]");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDModeTypePLAN_Value >= 0U && WindModeltestfinal_P.MFDModeTypePLAN_Value <= 3U, "MFDModeTypePLAN_Value should be in [0,3]");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDModeTypePPSN_Value >= 0U && WindModeltestfinal_P.MFDModeTypePPSN_Value <= 3U, "MFDModeTypePPSN_Value should be in [0,3]");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDModeTypeBLANK_Value >= 0U && WindModeltestfinal_P.MFDModeTypeBLANK_Value <= 3U, "MFDModeTypeBLANK_Value should be in [0,3]");
|
||||
__CPROVER_assert(WindModeltestfinal_P.MFDMenuType_Value >= 0U, "MFDMenuType_Value should be non-negative");
|
||||
__CPROVER_assert(WindModeltestfinal_P.AFDConfigurationTypePFD_Value >= 0U, "AFDConfigurationTypePFD_Value should be non-negative");
|
||||
|
||||
/* Memory initial condition bounds */
|
||||
__CPROVER_assert(WindModeltestfinal_P.Memory_InitialCondition == 0, "Memory_InitialCondition should be 0");
|
||||
|
||||
/* Floating point value assertions */
|
||||
__CPROVER_assert(WindModeltestfinal_P._0_5_double == 0.5, "0.5 double should be 0.5");
|
||||
__CPROVER_assert(WindModeltestfinal_P._0_double == 0.0, "0 double should be 0.0");
|
||||
|
||||
/* Range consistency checks */
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedMinC < WindModeltestfinal_P.WindSpeedUpperHystC, "WindSpeedMinC should be less than WindSpeedUpperHystC");
|
||||
__CPROVER_assert(WindModeltestfinal_P.WindSpeedUpperHystC < WindModeltestfinal_P.WindSpeedMaxC, "WindSpeedUpperHystC should be less than WindSpeedMaxC");
|
||||
@ -0,0 +1 @@
|
||||
// Error: API request failed. Please check your API key and network connection.
|
||||
@ -0,0 +1,157 @@
|
||||
/**********************************************
|
||||
Copyright @Avic 2024 All Rights Reserved
|
||||
File Name: main.c
|
||||
File Description:ÌṩÖ÷³ÌÐòÈë¿Úmain
|
||||
Author:tanjiaxin
|
||||
Creation Date:2024-10-9
|
||||
History:
|
||||
1.Date:2024-11-7
|
||||
Author:xuming
|
||||
Modification: Ôö¼ÓÎļþÐòÑÔ
|
||||
************************************************/
|
||||
|
||||
/*****************FILE INCLUSION**********************/
|
||||
#include "MPC5646C.h"
|
||||
#include "common.h"
|
||||
#include "nvram.h"
|
||||
#include "spi.h"
|
||||
#include "wdg.h"
|
||||
#include "lquart.h"
|
||||
#include "pubit.h"
|
||||
#include "ibit.h"
|
||||
#include "pll.h"
|
||||
#include "atp.h"
|
||||
#include "spi_driver.h"
|
||||
|
||||
#include "test.h"
|
||||
#include "WindModeltestfinal.h"
|
||||
|
||||
|
||||
|
||||
/*****************MACRO DEFINITIONS**********************/
|
||||
|
||||
#define WM_BUFFER_SIZE 200
|
||||
|
||||
|
||||
/*****************TYPE DECLARATIONS**********************/
|
||||
|
||||
|
||||
|
||||
/*****************VARIABLE DEFINITIONS**********************/
|
||||
char WM_data_pg[WM_BUFFER_SIZE];
|
||||
uint8_t fix_step = 1;
|
||||
|
||||
extern ExtY_WindModeltestfinal_T WindModeltestfinal_Y;
|
||||
|
||||
/*****************FUNCTION DECLARATIONS**********************/
|
||||
|
||||
void WM_data_pakeage(ExtY_WindModeltestfinal_T* final,char* out_data)
|
||||
{
|
||||
// Preconditions
|
||||
__CPROVER_assume(final != NULL);
|
||||
__CPROVER_assume(out_data != NULL);
|
||||
__CPROVER_assume(__CPROVER_r_ok(final, sizeof(ExtY_WindModeltestfinal_T)));
|
||||
__CPROVER_assume(__CPROVER_w_ok(out_data, WM_BUFFER_SIZE));
|
||||
|
||||
uint32_t temp32 = 0;
|
||||
float temp_f = 0.0;
|
||||
int temp_L=0,size_d = 0;
|
||||
|
||||
temp32 = final->WindVisible;
|
||||
__CPROVER_assert(temp32 == final->WindVisible, "WindVisible assignment correct");
|
||||
snprintf(out_data, WM_BUFFER_SIZE, "WindVisible: %s,", temp32);
|
||||
__CPROVER_assert(strlen(out_data) < WM_BUFFER_SIZE, "snprintf WindVisible buffer bounds");
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L valid after WindVisible");
|
||||
size_d = WM_BUFFER_SIZE;
|
||||
__CPROVER_assert(size_d == WM_BUFFER_SIZE, "size_d assignment correct");
|
||||
|
||||
temp32 = final->WindDirectionColor;
|
||||
__CPROVER_assert(temp32 == final->WindDirectionColor, "WindDirectionColor assignment correct");
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindDirectionColor: %s,", temp32);
|
||||
__CPROVER_assert(temp_L + strlen("WindDirectionColor: %s,") < WM_BUFFER_SIZE, "snprintf WindDirectionColor buffer bounds");
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L valid after WindDirectionColor");
|
||||
|
||||
temp_f = final->WindSpeed;
|
||||
__CPROVER_assert(temp_f == final->WindSpeed, "WindSpeed assignment correct");
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeed: %s,", temp_f);
|
||||
__CPROVER_assert(temp_L + strlen("WindSpeed: %s,") < WM_BUFFER_SIZE, "snprintf WindSpeed buffer bounds");
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L valid after WindSpeed");
|
||||
|
||||
temp32 = final->WindSpeedColor;
|
||||
__CPROVER_assert(temp32 == final->WindSpeedColor, "WindSpeedColor assignment correct");
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeedColor: %s,", temp32);
|
||||
__CPROVER_assert(temp_L + strlen("WindSpeedColor: %s,") < WM_BUFFER_SIZE, "snprintf WindSpeedColor buffer bounds");
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L valid after WindSpeedColor");
|
||||
|
||||
temp_f = final->WindDirection;
|
||||
__CPROVER_assert(temp_f == final->WindDirection, "WindDirection assignment correct");
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeedColor: %s/r/n", temp_f);
|
||||
__CPROVER_assert(temp_L + strlen("WindSpeedColor: %s/r/n") < WM_BUFFER_SIZE, "snprintf WindDirection buffer bounds");
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L valid after WindDirection");
|
||||
|
||||
// Postcondition: output buffer is null-terminated
|
||||
__CPROVER_assert(out_data[WM_BUFFER_SIZE-1] == '\0' || temp_L < WM_BUFFER_SIZE-1, "output buffer null-terminated");
|
||||
|
||||
}
|
||||
|
||||
|
||||
int main(void) {
|
||||
// Preconditions for main
|
||||
__CPROVER_assume(sizeof(WM_data_pg) == WM_BUFFER_SIZE);
|
||||
|
||||
pll_120M();
|
||||
|
||||
lq_serial_init(120000000, 0, 115200); // ´®¿Ú³õʼ»¯
|
||||
|
||||
pu_BIT(); // Éϵç×Ô¼ì
|
||||
|
||||
initDSPI_gpio(); // SPI³õʼ»¯
|
||||
delay_spi(10); // ÑÓ³Ù
|
||||
|
||||
ATP_menu(); // µ÷ÓÃATP²Ëµ¥
|
||||
|
||||
WindModeltestfinal_initialize();
|
||||
|
||||
fix_step = 1;
|
||||
__CPROVER_assert(fix_step == 1, "fix_step initialized to 1");
|
||||
|
||||
//test_menu();
|
||||
|
||||
/* Loop forever */
|
||||
while(1){
|
||||
// Loop invariant
|
||||
__CPROVER_assert(fix_step == 0 || fix_step == 1, "fix_step boolean invariant");
|
||||
__CPROVER_assert(WM_data_pg[WM_BUFFER_SIZE-1] == '\0', "WM_data_pg null-terminated invariant");
|
||||
|
||||
delay_spi(30000);
|
||||
if(fix_step == 1){
|
||||
__CPROVER_assert(fix_step == 1, "fix_step condition true");
|
||||
fix_step = 0;
|
||||
__CPROVER_assert(fix_step == 0, "fix_step set to 0");
|
||||
memset(WM_data_pg,0,sizeof(WM_data_pg));//clear buff
|
||||
__CPROVER_assert(WM_data_pg[0] == '\0', "WM_data_pg cleared");
|
||||
__CPROVER_assert(sizeof(WM_data_pg) == WM_BUFFER_SIZE, "WM_data_pg size correct");
|
||||
WindModeltestfinal_step();//out:WindModeltestfinal_Y
|
||||
__CPROVER_assert(&WindModeltestfinal_Y != NULL, "WindModeltestfinal_Y valid");
|
||||
WM_data_pakeage(&WindModeltestfinal_Y,WM_data_pg);//data package
|
||||
__CPROVER_assert(WM_data_pg[0] != '\0' || strlen(WM_data_pg) == 0, "WM_data_pakeage produced valid output");
|
||||
lq_serial_putstr(0,WM_data_pg);
|
||||
__CPROVER_assert(WM_data_pg != NULL, "WM_data_pg valid for serial output");
|
||||
fix_step = 1;
|
||||
__CPROVER_assert(fix_step == 1, "fix_step reset to 1");
|
||||
}
|
||||
else
|
||||
{
|
||||
__CPROVER_assert(fix_step == 0, "fix_step condition false branch");
|
||||
}
|
||||
|
||||
// Loop variant (though infinite, maintain state consistency)
|
||||
__CPROVER_assert(fix_step == 0 || fix_step == 1, "fix_step remains boolean");
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,160 @@
|
||||
/**********************************************
|
||||
Copyright @Avic 2024 All Rights Reserved
|
||||
File Name: main.c
|
||||
File Description:ÌṩÖ÷³ÌÐòÈë¿Úmain
|
||||
Author:tanjiaxin
|
||||
Creation Date:2024-10-9
|
||||
History:
|
||||
1.Date:2024-11-7
|
||||
Author:xuming
|
||||
Modification: Ôö¼ÓÎļþÐòÑÔ
|
||||
************************************************/
|
||||
|
||||
/*****************FILE INCLUSION**********************/
|
||||
#include "MPC5646C.h"
|
||||
#include "common.h"
|
||||
#include "nvram.h"
|
||||
#include "spi.h"
|
||||
#include "wdg.h"
|
||||
#include "lquart.h"
|
||||
#include "pubit.h"
|
||||
#include "ibit.h"
|
||||
#include "pll.h"
|
||||
#include "atp.h"
|
||||
#include "spi_driver.h"
|
||||
|
||||
#include "test.h"
|
||||
#include "WindModeltestfinal.h"
|
||||
|
||||
|
||||
|
||||
/*****************MACRO DEFINITIONS**********************/
|
||||
|
||||
#define WM_BUFFER_SIZE 200
|
||||
|
||||
|
||||
/*****************TYPE DECLARATIONS**********************/
|
||||
|
||||
|
||||
|
||||
/*****************VARIABLE DEFINITIONS**********************/
|
||||
char WM_data_pg[WM_BUFFER_SIZE];
|
||||
uint8_t fix_step = 1;
|
||||
|
||||
extern ExtY_WindModeltestfinal_T WindModeltestfinal_Y;
|
||||
|
||||
/*****************FUNCTION DECLARATIONS**********************/
|
||||
|
||||
void WM_data_pakeage(ExtY_WindModeltestfinal_T* final,char* out_data)
|
||||
{
|
||||
// Preconditions
|
||||
__CPROVER_assume(final != NULL);
|
||||
__CPROVER_assume(out_data != NULL);
|
||||
__CPROVER_assume(__CPROVER_r_ok(final, sizeof(ExtY_WindModeltestfinal_T)));
|
||||
__CPROVER_assume(__CPROVER_w_ok(out_data, WM_BUFFER_SIZE));
|
||||
|
||||
uint32_t temp32 = 0;
|
||||
float temp_f = 0.0;
|
||||
int temp_L=0,size_d = 0;
|
||||
|
||||
temp32 = final->WindVisible;
|
||||
// Bounds checking for snprintf
|
||||
__CPROVER_assert(WM_BUFFER_SIZE > 0, "WM_BUFFER_SIZE must be positive");
|
||||
snprintf(out_data, WM_BUFFER_SIZE, "WindVisible: %s,", temp32);
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L within valid bounds after first snprintf");
|
||||
size_d = WM_BUFFER_SIZE;
|
||||
|
||||
temp32 = final->WindDirectionColor;
|
||||
// Buffer overflow prevention check
|
||||
__CPROVER_assert(temp_L >= 0 && WM_BUFFER_SIZE - temp_L > 0, "Sufficient buffer space for second snprintf");
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindDirectionColor: %s,", temp32);
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L within valid bounds after second snprintf");
|
||||
|
||||
temp_f = final->WindSpeed;
|
||||
// Buffer overflow prevention check
|
||||
__CPROVER_assert(temp_L >= 0 && WM_BUFFER_SIZE - temp_L > 0, "Sufficient buffer space for third snprintf");
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeed: %s,", temp_f);
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L within valid bounds after third snprintf");
|
||||
|
||||
temp32 = final->WindSpeedColor;
|
||||
// Buffer overflow prevention check
|
||||
__CPROVER_assert(temp_L >= 0 && WM_BUFFER_SIZE - temp_L > 0, "Sufficient buffer space for fourth snprintf");
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeedColor: %s,", temp32);
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L within valid bounds after fourth snprintf");
|
||||
|
||||
temp_f = final->WindDirection;
|
||||
// Buffer overflow prevention check
|
||||
__CPROVER_assert(temp_L >= 0 && WM_BUFFER_SIZE - temp_L > 0, "Sufficient buffer space for fifth snprintf");
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeedColor: %s/r/n", temp_f);
|
||||
temp_L = strlen(out_data);
|
||||
__CPROVER_assert(temp_L >= 0 && temp_L < WM_BUFFER_SIZE, "temp_L within valid bounds after fifth snprintf");
|
||||
|
||||
// Postcondition: output buffer is null-terminated
|
||||
__CPROVER_assert(out_data[WM_BUFFER_SIZE-1] == '\0' || temp_L < WM_BUFFER_SIZE-1, "Output buffer properly null-terminated");
|
||||
}
|
||||
|
||||
|
||||
int main(void) {
|
||||
// Array bounds check
|
||||
__CPROVER_assert(WM_BUFFER_SIZE > 0, "WM_BUFFER_SIZE must be positive");
|
||||
__CPROVER_assert(sizeof(WM_data_pg) == WM_BUFFER_SIZE, "WM_data_pg has correct size");
|
||||
|
||||
pll_120M();
|
||||
|
||||
lq_serial_init(120000000, 0, 115200); // ´®¿Ú³õʼ»¯
|
||||
|
||||
pu_BIT(); // Éϵç×Ô¼ì
|
||||
|
||||
initDSPI_gpio(); // SPI³õʼ»¯
|
||||
delay_spi(10); // ÑÓ³Ù
|
||||
|
||||
ATP_menu(); // µ÷ÓÃATP²Ëµ¥
|
||||
|
||||
WindModeltestfinal_initialize();
|
||||
|
||||
fix_step = 1;
|
||||
__CPROVER_assert(fix_step == 1, "fix_step initialized to 1");
|
||||
|
||||
//test_menu();
|
||||
|
||||
/* Loop forever */
|
||||
while(1){
|
||||
// Loop invariant: fix_step is either 0 or 1
|
||||
__CPROVER_assert(fix_step == 0 || fix_step == 1, "fix_step is boolean value");
|
||||
|
||||
delay_spi(30000);
|
||||
if(fix_step == 1){
|
||||
fix_step = 0;
|
||||
__CPROVER_assert(fix_step == 0, "fix_step set to 0");
|
||||
|
||||
// Buffer safety check
|
||||
__CPROVER_assert(WM_data_pg != NULL, "WM_data_pg is not NULL");
|
||||
__CPROVER_assert(sizeof(WM_data_pg) == WM_BUFFER_SIZE, "WM_data_pg has correct size");
|
||||
memset(WM_data_pg,0,sizeof(WM_data_pg));//clear buff
|
||||
|
||||
// Pointer safety for WindModeltestfinal_Y
|
||||
__CPROVER_assert(&WindModeltestfinal_Y != NULL, "WindModeltestfinal_Y address valid");
|
||||
WindModeltestfinal_step();//out:WindModeltestfinal_Y
|
||||
|
||||
// Function call preconditions
|
||||
__CPROVER_assert(&WindModeltestfinal_Y != NULL, "WindModeltestfinal_Y pointer valid");
|
||||
__CPROVER_assert(WM_data_pg != NULL, "WM_data_pg pointer valid");
|
||||
WM_data_pakeage(&WindModeltestfinal_Y,WM_data_pg);//data package
|
||||
|
||||
lq_serial_putstr(0,WM_data_pg);
|
||||
fix_step = 1;
|
||||
__CPROVER_assert(fix_step == 1, "fix_step reset to 1");
|
||||
}
|
||||
else
|
||||
{
|
||||
__CPROVER_assert(fix_step == 0, "fix_step remains 0 in else branch");
|
||||
}
|
||||
|
||||
// Loop postcondition: fix_step is either 0 or 1
|
||||
__CPROVER_assert(fix_step == 0 || fix_step == 1, "fix_step remains boolean after loop iteration");
|
||||
}
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
// Error: API request failed. Please check your API key and network connection.
|
||||
@ -0,0 +1,182 @@
|
||||
/*
|
||||
* rtGetInf.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finite, Inf
|
||||
*/
|
||||
#include "rtGetInf.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
/*
|
||||
* Initialize rtInf needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetInf(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
__CPROVER_assert(bitsPerReal > 0, "bitsPerReal must be positive");
|
||||
__CPROVER_assert(bitsPerReal <= 64, "bitsPerReal size reasonable");
|
||||
float inf = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
inf = rtGetInfF();
|
||||
__CPROVER_assert(!__CPROVER_isnanf(inf), "rtGetInfF should not return NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(inf), "rtGetInfF should return infinity");
|
||||
__CPROVER_assert(inf > 0, "rtGetInfF should return positive infinity");
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
__CPROVER_assert(machByteOrder == LittleEndian || machByteOrder == BigEndian,
|
||||
"machByteOrder must be valid enum value");
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
inf = tmpVal.fltVal;
|
||||
__CPROVER_assert(!__CPROVER_isnanf(inf), "LittleEndian inf should not be NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(inf), "LittleEndian inf should be infinity");
|
||||
__CPROVER_assert(inf > 0, "LittleEndian inf should be positive");
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
inf = tmpVal.fltVal;
|
||||
__CPROVER_assert(!__CPROVER_isnanf(inf), "BigEndian inf should not be NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(inf), "BigEndian inf should be infinity");
|
||||
__CPROVER_assert(inf > 0, "BigEndian inf should be positive");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__CPROVER_assert(!__CPROVER_isnanf(inf), "rtGetInf should not return NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(inf), "rtGetInf should return infinity");
|
||||
__CPROVER_assert(inf > 0, "rtGetInf should return positive infinity");
|
||||
return inf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtInfF needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetInfF(void)
|
||||
{
|
||||
IEEESingle infF;
|
||||
infF.wordL.wordLuint = 0x7F800000U;
|
||||
__CPROVER_assert(infF.wordL.wordLuint == 0x7F800000U, "Infinity bit pattern correct");
|
||||
real32_T result = infF.wordL.wordLreal;
|
||||
__CPROVER_assert(!__CPROVER_isnanf(result), "rtGetInfF should not return NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(result), "rtGetInfF should return infinity");
|
||||
__CPROVER_assert(result > 0, "rtGetInfF should return positive infinity");
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtMinusInf needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetMinusInf(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
__CPROVER_assert(bitsPerReal > 0, "bitsPerReal must be positive");
|
||||
__CPROVER_assert(bitsPerReal <= 64, "bitsPerReal size reasonable");
|
||||
float minf = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
minf = rtGetMinusInfF();
|
||||
__CPROVER_assert(!__CPROVER_isnanf(minf), "rtGetMinusInfF should not return NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(minf), "rtGetMinusInfF should return infinity");
|
||||
__CPROVER_assert(minf < 0, "rtGetMinusInfF should return negative infinity");
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
__CPROVER_assert(machByteOrder == LittleEndian || machByteOrder == BigEndian,
|
||||
"machByteOrder must be valid enum value");
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
minf = tmpVal.fltVal;
|
||||
__CPROVER_assert(!__CPROVER_isnanf(minf), "LittleEndian minf should not be NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(minf), "LittleEndian minf should be infinity");
|
||||
__CPROVER_assert(minf < 0, "LittleEndian minf should be negative");
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
minf = tmpVal.fltVal;
|
||||
__CPROVER_assert(!__CPROVER_isnanf(minf), "BigEndian minf should not be NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(minf), "BigEndian minf should be infinity");
|
||||
__CPROVER_assert(minf < 0, "BigEndian minf should be negative");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__CPROVER_assert(!__CPROVER_isnanf(minf), "rtGetMinusInf should not return NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(minf), "rtGetMinusInf should return infinity");
|
||||
__CPROVER_assert(minf < 0, "rtGetMinusInf should return negative infinity");
|
||||
return minf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtMinusInfF needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetMinusInfF(void)
|
||||
{
|
||||
IEEESingle minfF;
|
||||
minfF.wordL.wordLuint = 0xFF800000U;
|
||||
__CPROVER_assert(minfF.wordL.wordLuint == 0xFF800000U, "Minus infinity bit pattern correct");
|
||||
real32_T result = minfF.wordL.wordLreal;
|
||||
__CPROVER_assert(!__CPROVER_isnanf(result), "rtGetMinusInfF should not return NaN");
|
||||
__CPROVER_assert(__CPROVER_isinff(result), "rtGetMinusInfF should return infinity");
|
||||
__CPROVER_assert(result < 0, "rtGetMinusInfF should return negative infinity");
|
||||
return result;
|
||||
}
|
||||
@ -0,0 +1,162 @@
|
||||
/*
|
||||
* rtGetInf.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finite, Inf
|
||||
*/
|
||||
#include "rtGetInf.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
/*
|
||||
* Initialize rtInf needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetInf(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
__CPROVER_assert(bitsPerReal > 0, "bitsPerReal must be positive");
|
||||
__CPROVER_assert(bitsPerReal <= 64, "bitsPerReal size reasonable");
|
||||
float inf = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
inf = rtGetInfF();
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
__CPROVER_assert(machByteOrder == LittleEndian || machByteOrder == BigEndian,
|
||||
"machByteOrder must be valid enum value");
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
inf = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
inf = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__CPROVER_assert(!__CPROVER_isnormal(inf), "inf should not be normal number");
|
||||
__CPROVER_assert(__CPROVER_isinff(inf), "return value should be infinity");
|
||||
__CPROVER_assert(inf > 0, "positive infinity returned");
|
||||
return inf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtInfF needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetInfF(void)
|
||||
{
|
||||
IEEESingle infF;
|
||||
infF.wordL.wordLuint = 0x7F800000U;
|
||||
__CPROVER_assert(infF.wordL.wordLuint == 0x7F800000U, "infinity bit pattern correct");
|
||||
__CPROVER_assert(!__CPROVER_isnormal(infF.wordL.wordLreal), "infF should not be normal");
|
||||
__CPROVER_assert(__CPROVER_isinff(infF.wordL.wordLreal), "infF should be infinity");
|
||||
__CPROVER_assert(infF.wordL.wordLreal > 0, "positive infinity returned");
|
||||
return infF.wordL.wordLreal;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtMinusInf needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetMinusInf(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
__CPROVER_assert(bitsPerReal > 0, "bitsPerReal must be positive");
|
||||
__CPROVER_assert(bitsPerReal <= 64, "bitsPerReal size reasonable");
|
||||
float minf = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
minf = rtGetMinusInfF();
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
__CPROVER_assert(machByteOrder == LittleEndian || machByteOrder == BigEndian,
|
||||
"machByteOrder must be valid enum value");
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
minf = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
minf = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__CPROVER_assert(!__CPROVER_isnormal(minf), "minf should not be normal number");
|
||||
__CPROVER_assert(__CPROVER_isinff(minf), "return value should be infinity");
|
||||
__CPROVER_assert(minf < 0, "negative infinity returned");
|
||||
return minf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtMinusInfF needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetMinusInfF(void)
|
||||
{
|
||||
IEEESingle minfF;
|
||||
minfF.wordL.wordLuint = 0xFF800000U;
|
||||
__CPROVER_assert(minfF.wordL.wordLuint == 0xFF800000U, "minus infinity bit pattern correct");
|
||||
__CPROVER_assert(!__CPROVER_isnormal(minfF.wordL.wordLreal), "minfF should not be normal");
|
||||
__CPROVER_assert(__CPROVER_isinff(minfF.wordL.wordLreal), "minfF should be infinity");
|
||||
__CPROVER_assert(minfF.wordL.wordLreal < 0, "negative infinity returned");
|
||||
return minfF.wordL.wordLreal;
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
// Error: API request failed. Please check your API key and network connection.
|
||||
@ -0,0 +1,122 @@
|
||||
/*
|
||||
* rtGetNaN.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finite, NaN
|
||||
*/
|
||||
#include "rtGetNaN.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
/*
|
||||
* Initialize rtNaN needed by the generated code.
|
||||
* NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetNaN(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
__CPROVER_assert(bitsPerReal == 32U || bitsPerReal == 64U, "bitsPerReal must be 32 or 64");
|
||||
__CPROVER_assert(sizeof(float) * NumBitsPerChar == bitsPerReal, "Size calculation overflow");
|
||||
|
||||
float nan = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
nan = rtGetNaNF();
|
||||
__CPROVER_assert(!__CPROVER_isnormal(nan) && !__CPROVER_iszero(nan), "rtGetNaNF should return NaN");
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
__CPROVER_assert(sizeof(one) == 2, "uint16_T size assumption");
|
||||
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
__CPROVER_assert(machByteOrder == LittleEndian || machByteOrder == BigEndian, "Valid byte order");
|
||||
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
__CPROVER_assert(sizeof(tmpVal) >= sizeof(float), "Union size sufficient");
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF80000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
nan = tmpVal.fltVal;
|
||||
__CPROVER_assert(!__CPROVER_isnormal(nan) && !__CPROVER_iszero(nan), "LittleEndian should produce NaN");
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
__CPROVER_assert(sizeof(tmpVal) >= sizeof(float), "Union size sufficient");
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FFFFFFFU;
|
||||
tmpVal.bitVal.words.wordL = 0xFFFFFFFFU;
|
||||
nan = tmpVal.fltVal;
|
||||
__CPROVER_assert(!__CPROVER_isnormal(nan) && !__CPROVER_iszero(nan), "BigEndian should produce NaN");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__CPROVER_assert(!__CPROVER_isnormal(nan) && !__CPROVER_iszero(nan), "Function must return NaN");
|
||||
return nan;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtNaNF needed by the generated code.
|
||||
* NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetNaNF(void)
|
||||
{
|
||||
IEEESingle nanF = { { 0 } };
|
||||
__CPROVER_assert(sizeof(nanF) >= sizeof(real32_T), "IEEESingle size sufficient");
|
||||
|
||||
uint16_T one = 1U;
|
||||
__CPROVER_assert(sizeof(one) == 2, "uint16_T size assumption");
|
||||
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
__CPROVER_assert(machByteOrder == LittleEndian || machByteOrder == BigEndian, "Valid byte order");
|
||||
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
nanF.wordL.wordLuint = 0xFFC00000U;
|
||||
__CPROVER_assert(nanF.wordL.wordLuint == 0xFFC00000U, "LittleEndian NaN pattern set correctly");
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
nanF.wordL.wordLuint = 0x7FFFFFFFU;
|
||||
__CPROVER_assert(nanF.wordL.wordLuint == 0x7FFFFFFFU, "BigEndian NaN pattern set correctly");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
__CPROVER_assert(!__CPROVER_isnormal(nanF.wordL.wordLreal) && !__CPROVER_iszero(nanF.wordL.wordLreal),
|
||||
"rtGetNaNF must return NaN value");
|
||||
return nanF.wordL.wordLreal;
|
||||
}
|
||||
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* rtGetNaN.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finite, NaN
|
||||
*/
|
||||
#include "rtGetNaN.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
/*
|
||||
* Initialize rtNaN needed by the generated code.
|
||||
* NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetNaN(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
__CPROVER_assert(bitsPerReal == 32U || bitsPerReal == 64U, "bitsPerReal must be 32 or 64");
|
||||
__CPROVER_assert(sizeof(float) * NumBitsPerChar == bitsPerReal, "Size calculation must be correct");
|
||||
|
||||
float nan = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
nan = rtGetNaNF();
|
||||
__CPROVER_assert(__CPROVER_isnanf(nan), "rtGetNaNF must return NaN");
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
__CPROVER_assert(sizeof(one) == 2, "uint16_T must be 2 bytes");
|
||||
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
__CPROVER_assert(machByteOrder == LittleEndian || machByteOrder == BigEndian, "Byte order must be valid");
|
||||
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
__CPROVER_assert(sizeof(tmpVal) >= sizeof(float), "Union size must accommodate float");
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF80000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
nan = tmpVal.fltVal;
|
||||
__CPROVER_assert(__CPROVER_isnand(nan), "LittleEndian must produce NaN");
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
__CPROVER_assert(sizeof(tmpVal) >= sizeof(float), "Union size must accommodate float");
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FFFFFFFU;
|
||||
tmpVal.bitVal.words.wordL = 0xFFFFFFFFU;
|
||||
nan = tmpVal.fltVal;
|
||||
__CPROVER_assert(__CPROVER_isnand(nan), "BigEndian must produce NaN");
|
||||
break;
|
||||
}
|
||||
}
|
||||
__CPROVER_assert(__CPROVER_isnand(nan), "Double precision path must return NaN");
|
||||
}
|
||||
|
||||
__CPROVER_assert(__CPROVER_isnanf(nan) || __CPROVER_isnand(nan), "Function must return NaN");
|
||||
return nan;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtNaNF needed by the generated code.
|
||||
* NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetNaNF(void)
|
||||
{
|
||||
IEEESingle nanF = { { 0 } };
|
||||
__CPROVER_assert(sizeof(nanF) >= sizeof(real32_T), "IEEESingle must accommodate real32_T");
|
||||
|
||||
uint16_T one = 1U;
|
||||
__CPROVER_assert(sizeof(one) == 2, "uint16_T must be 2 bytes");
|
||||
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
__CPROVER_assert(machByteOrder == LittleEndian || machByteOrder == BigEndian, "Byte order must be valid");
|
||||
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
nanF.wordL.wordLuint = 0xFFC00000U;
|
||||
__CPROVER_assert(nanF.wordL.wordLuint == 0xFFC00000U, "LittleEndian NaN pattern must be set correctly");
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
nanF.wordL.wordLuint = 0x7FFFFFFFU;
|
||||
__CPROVER_assert(nanF.wordL.wordLuint == 0x7FFFFFFFU, "BigEndian NaN pattern must be set correctly");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
real32_T result = nanF.wordL.wordLreal;
|
||||
__CPROVER_assert(__CPROVER_isnanf(result), "rtGetNaNF must return NaN");
|
||||
return result;
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
// Error: API request failed. Please check your API key and network connection.
|
||||
@ -0,0 +1,139 @@
|
||||
/*
|
||||
* rt_nonfinite.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finites,
|
||||
* (Inf, NaN and -Inf).
|
||||
*/
|
||||
#include "rt_nonfinite.h"
|
||||
#include "rtGetNaN.h"
|
||||
#include "rtGetInf.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
float rtInf;
|
||||
float rtMinusInf;
|
||||
float rtNaN;
|
||||
real32_T rtInfF;
|
||||
real32_T rtMinusInfF;
|
||||
real32_T rtNaNF;
|
||||
|
||||
/*
|
||||
* Initialize the rtInf, rtMinusInf, and rtNaN needed by the
|
||||
* generated code. NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
void rt_InitInfAndNaN(size_t realSize)
|
||||
{
|
||||
/* Precondition: realSize must be valid for floating-point types */
|
||||
__CPROVER_assume(realSize == sizeof(float) || realSize == sizeof(double));
|
||||
|
||||
(void) (realSize);
|
||||
rtNaN = rtGetNaN();
|
||||
rtNaNF = rtGetNaNF();
|
||||
rtInf = rtGetInf();
|
||||
rtInfF = rtGetInfF();
|
||||
rtMinusInf = rtGetMinusInf();
|
||||
rtMinusInfF = rtGetMinusInfF();
|
||||
|
||||
/* Postcondition: Non-finite values should be properly initialized */
|
||||
__CPROVER_assert(__CPROVER_isnan(rtNaN), "rtNaN should be NaN");
|
||||
__CPROVER_assert(__CPROVER_isnan(rtNaNF), "rtNaNF should be NaN");
|
||||
__CPROVER_assert(!__CPROVER_isnan(rtInf) && !__CPROVER_isnormal(rtInf), "rtInf should be infinite");
|
||||
__CPROVER_assert(!__CPROVER_isnan(rtInfF) && !__CPROVER_isnormal(rtInfF), "rtInfF should be infinite");
|
||||
__CPROVER_assert(!__CPROVER_isnan(rtMinusInf) && !__CPROVER_isnormal(rtMinusInf), "rtMinusInf should be infinite");
|
||||
__CPROVER_assert(!__CPROVER_isnan(rtMinusInfF) && !__CPROVER_isnormal(rtMinusInfF), "rtMinusInfF should be infinite");
|
||||
}
|
||||
|
||||
/* Test if value is infinite */
|
||||
boolean_T rtIsInf(float value)
|
||||
{
|
||||
/* Precondition: value should be a valid float */
|
||||
__CPROVER_assume(__CPROVER_isnan(value) || __CPROVER_isfinite(value) ||
|
||||
__CPROVER_isinf(value));
|
||||
|
||||
boolean_T result = (boolean_T)((value==rtInf || value==rtMinusInf) ? 1U : 0U);
|
||||
|
||||
/* Postcondition: result should match IEEE infinity check */
|
||||
__CPROVER_assert(result == __CPROVER_isinf(value), "rtIsInf should match IEEE infinity definition");
|
||||
__CPROVER_assert(result == 0 || result == 1, "rtIsInf result should be boolean");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Test if single-precision value is infinite */
|
||||
boolean_T rtIsInfF(real32_T value)
|
||||
{
|
||||
/* Precondition: value should be a valid real32_T */
|
||||
__CPROVER_assume(__CPROVER_isnan(value) || __CPROVER_isfinite(value) ||
|
||||
__CPROVER_isinf(value));
|
||||
|
||||
boolean_T result = (boolean_T)(((value)==rtInfF || (value)==rtMinusInfF) ? 1U : 0U);
|
||||
|
||||
/* Postcondition: result should match IEEE infinity check */
|
||||
__CPROVER_assert(result == __CPROVER_isinf(value), "rtIsInfF should match IEEE infinity definition");
|
||||
__CPROVER_assert(result == 0 || result == 1, "rtIsInfF result should be boolean");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Test if value is not a number */
|
||||
boolean_T rtIsNaN(float value)
|
||||
{
|
||||
boolean_T result = (boolean_T) 0;
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
|
||||
/* Precondition: bitsPerReal calculation should be correct */
|
||||
__CPROVER_assert(bitsPerReal == sizeof(float) * 8, "bitsPerReal calculation should be correct");
|
||||
|
||||
if (bitsPerReal == 32U) {
|
||||
result = rtIsNaNF((real32_T)value);
|
||||
} else {
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.fltVal = value;
|
||||
result = (boolean_T)((tmpVal.bitVal.words.wordH & 0x7FF00000) == 0x7FF00000 &&
|
||||
( (tmpVal.bitVal.words.wordH & 0x000FFFFF) != 0 ||
|
||||
(tmpVal.bitVal.words.wordL != 0) ));
|
||||
}
|
||||
|
||||
/* Postcondition: result should match IEEE NaN check */
|
||||
__CPROVER_assert(result == __CPROVER_isnan(value), "rtIsNaN should match IEEE NaN definition");
|
||||
__CPROVER_assert(result == 0 || result == 1, "rtIsNaN result should be boolean");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Test if single-precision value is not a number */
|
||||
boolean_T rtIsNaNF(real32_T value)
|
||||
{
|
||||
/* Precondition: value should be a valid real32_T */
|
||||
__CPROVER_assume(__CPROVER_isnan(value) || __CPROVER_isfinite(value) ||
|
||||
__CPROVER_isinf(value));
|
||||
|
||||
IEEESingle tmp;
|
||||
tmp.wordL.wordLreal = value;
|
||||
boolean_T result = (boolean_T)( (tmp.wordL.wordLuint & 0x7F800000) == 0x7F800000 &&
|
||||
(tmp.wordL.wordLuint & 0x007FFFFF) != 0 );
|
||||
|
||||
/* Postcondition: result should match IEEE NaN check */
|
||||
__CPROVER_assert(result == __CPROVER_isnan(value), "rtIsNaNF should match IEEE NaN definition");
|
||||
__CPROVER_assert(result == 0 || result == 1, "rtIsNaNF result should be boolean");
|
||||
|
||||
return result;
|
||||
}
|
||||
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* rt_nonfinite.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finites,
|
||||
* (Inf, NaN and -Inf).
|
||||
*/
|
||||
#include "rt_nonfinite.h"
|
||||
#include "rtGetNaN.h"
|
||||
#include "rtGetInf.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
float rtInf;
|
||||
float rtMinusInf;
|
||||
float rtNaN;
|
||||
real32_T rtInfF;
|
||||
real32_T rtMinusInfF;
|
||||
real32_T rtNaNF;
|
||||
|
||||
/*
|
||||
* Initialize the rtInf, rtMinusInf, and rtNaN needed by the
|
||||
* generated code. NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
void rt_InitInfAndNaN(size_t realSize)
|
||||
{
|
||||
__CPROVER_assume(realSize == sizeof(float) || realSize == sizeof(double));
|
||||
|
||||
(void) (realSize);
|
||||
rtNaN = rtGetNaN();
|
||||
rtNaNF = rtGetNaNF();
|
||||
rtInf = rtGetInf();
|
||||
rtInfF = rtGetInfF();
|
||||
rtMinusInf = rtGetMinusInf();
|
||||
rtMinusInfF = rtGetMinusInfF();
|
||||
|
||||
// Postconditions: verify that special values are properly initialized
|
||||
__CPROVER_assert(rtIsNaN(rtNaN), "rtNaN should be NaN");
|
||||
__CPROVER_assert(rtIsNaNF(rtNaNF), "rtNaNF should be NaN");
|
||||
__CPROVER_assert(rtIsInf(rtInf), "rtInf should be Inf");
|
||||
__CPROVER_assert(rtIsInfF(rtInfF), "rtInfF should be Inf");
|
||||
__CPROVER_assert(rtIsInf(rtMinusInf), "rtMinusInf should be -Inf");
|
||||
__CPROVER_assert(rtIsInfF(rtMinusInfF), "rtMinusInfF should be -Inf");
|
||||
}
|
||||
|
||||
/* Test if value is infinite */
|
||||
boolean_T rtIsInf(float value)
|
||||
{
|
||||
__CPROVER_assert(!rtIsNaN(value), "Input value should not be NaN for rtIsInf check");
|
||||
|
||||
boolean_T result = (boolean_T)((value==rtInf || value==rtMinusInf) ? 1U : 0U);
|
||||
|
||||
// Postcondition: result should be boolean (0 or 1)
|
||||
__CPROVER_assert(result == 0U || result == 1U, "rtIsInf result should be boolean");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Test if single-precision value is infinite */
|
||||
boolean_T rtIsInfF(real32_T value)
|
||||
{
|
||||
__CPROVER_assert(!rtIsNaNF(value), "Input value should not be NaN for rtIsInfF check");
|
||||
|
||||
boolean_T result = (boolean_T)(((value)==rtInfF || (value)==rtMinusInfF) ? 1U : 0U);
|
||||
|
||||
// Postcondition: result should be boolean (0 or 1)
|
||||
__CPROVER_assert(result == 0U || result == 1U, "rtIsInfF result should be boolean");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Test if value is not a number */
|
||||
boolean_T rtIsNaN(float value)
|
||||
{
|
||||
boolean_T result = (boolean_T) 0;
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
|
||||
// Precondition: bitsPerReal should be reasonable size
|
||||
__CPROVER_assert(bitsPerReal == 32U || bitsPerReal == 64U, "bitsPerReal should be 32 or 64");
|
||||
|
||||
if (bitsPerReal == 32U) {
|
||||
result = rtIsNaNF((real32_T)value);
|
||||
} else {
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.fltVal = value;
|
||||
result = (boolean_T)((tmpVal.bitVal.words.wordH & 0x7FF00000) == 0x7FF00000 &&
|
||||
( (tmpVal.bitVal.words.wordH & 0x000FFFFF) != 0 ||
|
||||
(tmpVal.bitVal.words.wordL != 0) ));
|
||||
}
|
||||
|
||||
// Postcondition: result should be boolean (0 or 1)
|
||||
__CPROVER_assert(result == 0U || result == 1U, "rtIsNaN result should be boolean");
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Test if single-precision value is not a number */
|
||||
boolean_T rtIsNaNF(real32_T value)
|
||||
{
|
||||
IEEESingle tmp;
|
||||
tmp.wordL.wordLreal = value;
|
||||
boolean_T result = (boolean_T)( (tmp.wordL.wordLuint & 0x7F800000) == 0x7F800000 &&
|
||||
(tmp.wordL.wordLuint & 0x007FFFFF) != 0 );
|
||||
|
||||
// Postcondition: result should be boolean (0 or 1)
|
||||
__CPROVER_assert(result == 0U || result == 1U, "rtIsNaNF result should be boolean");
|
||||
|
||||
return result;
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
// Error: API request failed. Please check your API key and network connection.
|
||||
@ -0,0 +1,409 @@
|
||||
/*
|
||||
* WindModeltestfinal.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
#include "WindModeltestfinal.h"
|
||||
#include "WindModeltestfinal_private.h"
|
||||
#include<string.h>
|
||||
/* Block states (default storage) */
|
||||
DW_WindModeltestfinal_T WindModeltestfinal_DW;
|
||||
|
||||
/* External inputs (root inport signals with default storage) */
|
||||
ExtU_WindModeltestfinal_T WindModeltestfinal_U;
|
||||
|
||||
/* External outputs (root outports fed by signals with default storage) */
|
||||
ExtY_WindModeltestfinal_T WindModeltestfinal_Y;
|
||||
|
||||
/* Real-time model */
|
||||
static RT_MODEL_WindModeltestfinal_T WindModeltestfinal_M_;
|
||||
RT_MODEL_WindModeltestfinal_T *const WindModeltestfinal_M =
|
||||
&WindModeltestfinal_M_;
|
||||
|
||||
/* Model step function */
|
||||
void WindModeltestfinal_step(void)
|
||||
{
|
||||
float rtb_Sum_c;
|
||||
int32_T tmp;
|
||||
int32_T tmp_0;
|
||||
int32_T tmp_1;
|
||||
int32_T tmp_2;
|
||||
int32_T tmp_3;
|
||||
boolean_T rtb_LogicalOperator_f;
|
||||
boolean_T rtb_Switch_i;
|
||||
|
||||
/* Switch: '<S6>/Switch' incorporates:
|
||||
* Constant: '<S1>/WindSpeedMinC'
|
||||
* Constant: '<S1>/WindSpeedUpperHystC'
|
||||
* Inport: '<Root>/WindSpeedFMSSide'
|
||||
* Memory: '<S6>/Memory'
|
||||
* RelationalOperator: '<S6>/Relational Operator'
|
||||
* RelationalOperator: '<S6>/Relational Operator1'
|
||||
*/
|
||||
/*
|
||||
if (WindModeltestfinal_DW.Memory_PreviousInput) {
|
||||
rtb_Switch_i = (WindModeltestfinal_U.WindSpeedFMSSide >=
|
||||
WindModeltestfinal_P.WindSpeedMinC_Value);
|
||||
} else {
|
||||
rtb_Switch_i = (WindModeltestfinal_U.WindSpeedFMSSide >
|
||||
WindModeltestfinal_P.WindSpeedUpperHystC_Value);
|
||||
}
|
||||
* */
|
||||
|
||||
|
||||
/* End of Switch: '<S6>/Switch' */
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator1' incorporates:
|
||||
* Inport: '<Root>/DuConfig'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.DuConfig;
|
||||
if (WindModeltestfinal_U.DuConfig < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
|
||||
/* Switch: '<S3>/Switch' incorporates:
|
||||
* Constant: '<S3>/AFDConfigurationType PFD'
|
||||
* Constant: '<S3>/MFDMenuType'
|
||||
* Constant: '<S3>/MFDModeType = PLAN'
|
||||
* Constant: '<S3>/MFDModeType = TCAS'
|
||||
* Constant: '<S3>/MFDModeType= BLANK'
|
||||
* Constant: '<S3>/MFDModeType=PPSN'
|
||||
* Constant: '<S3>/PFDMenuType'
|
||||
* Inport: '<Root>/TrueRefHeadingIsValid'
|
||||
* Inport: '<Root>/UnusualAttitude'
|
||||
* Inport: '<Root>/WindDirectionTrueFMSSideIsValid'
|
||||
* Inport: '<Root>/WindSpeedFMSSideIsValid'
|
||||
* Logic: '<S3>/Logical Operator'
|
||||
* Logic: '<S3>/Logical Operator1'
|
||||
* Logic: '<S3>/Logical Operator2'
|
||||
* Logic: '<S3>/Logical Operator3'
|
||||
* Logic: '<S3>/Logical Operator4'
|
||||
* RelationalOperator: '<S3>/Relational Operator'
|
||||
* RelationalOperator: '<S3>/Relational Operator1'
|
||||
* RelationalOperator: '<S3>/Relational Operator2'
|
||||
* RelationalOperator: '<S3>/Relational Operator3'
|
||||
* RelationalOperator: '<S3>/Relational Operator4'
|
||||
* RelationalOperator: '<S3>/Relational Operator5'
|
||||
* RelationalOperator: '<S3>/Relational Operator6'
|
||||
*/
|
||||
if ((uint32_T)tmp_3 == WindModeltestfinal_P.AFDConfigurationTypePFD_Value) {
|
||||
/* RelationalOperator: '<S3>/Relational Operator' incorporates:
|
||||
* Inport: '<Root>/PFDActiveMenu'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.PFDActiveMenu;
|
||||
if (WindModeltestfinal_U.PFDActiveMenu < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
|
||||
rtb_LogicalOperator_f = ((WindModeltestfinal_U.TrueRefHeadingIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindSpeedFMSSideIsValid != 0) &&
|
||||
(WindModeltestfinal_U.UnusualAttitude == 0) && ((uint32_T)tmp_3 ==
|
||||
WindModeltestfinal_P.PFDMenuType_Value));
|
||||
} else {
|
||||
/* RelationalOperator: '<S3>/Relational Operator2' incorporates:
|
||||
* Inport: '<Root>/MFDActiveLowerMenu'
|
||||
*/
|
||||
tmp_3 = WindModeltestfinal_U.MFDActiveLowerMenu;
|
||||
if (WindModeltestfinal_U.MFDActiveLowerMenu < 0) {
|
||||
tmp_3 = 0;
|
||||
}
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator3' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp = 0;
|
||||
}
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator4' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_0 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_0 = 0;
|
||||
}
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator5' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_1 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_1 = 0;
|
||||
}
|
||||
|
||||
/* RelationalOperator: '<S3>/Relational Operator6' incorporates:
|
||||
* Inport: '<Root>/MFDMode2'
|
||||
*/
|
||||
tmp_2 = WindModeltestfinal_U.MFDMode2;
|
||||
if (WindModeltestfinal_U.MFDMode2 < 0) {
|
||||
tmp_2 = 0;
|
||||
}
|
||||
|
||||
rtb_LogicalOperator_f = ((WindModeltestfinal_U.WindSpeedFMSSideIsValid != 0)
|
||||
&& ((WindModeltestfinal_U.TrueRefHeadingIsValid != 0) &&
|
||||
(WindModeltestfinal_U.WindDirectionTrueFMSSideIsValid != 0)) &&
|
||||
((uint32_T)tmp_3 == WindModeltestfinal_P.MFDMenuType_Value) && (((uint32_T)
|
||||
tmp == WindModeltestfinal_P.MFDModeTypeBLANK_Value) || ((uint32_T)tmp_0 ==
|
||||
WindModeltestfinal_P.MFDModeTypePPSN_Value) || ((uint32_T)tmp_1 ==
|
||||
WindModeltestfinal_P.MFDModeTypePLAN_Value) || ((uint32_T)tmp_2 ==
|
||||
WindModeltestfinal_P.MFDModeTypeTCAS_Value)));
|
||||
}
|
||||
|
||||
/* End of Switch: '<S3>/Switch' */
|
||||
|
||||
/* Logic: '<S6>/Logical Operator' incorporates:
|
||||
* DataTypeConversion: '<S3>/Data Type Conversion'
|
||||
*/
|
||||
rtb_LogicalOperator_f = (rtb_Switch_i && rtb_LogicalOperator_f);
|
||||
|
||||
/* Outport: '<Root>/WindVisible' incorporates:
|
||||
* DataTypeConversion: '<S2>/Data Type Conversion'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindVisible = rtb_LogicalOperator_f;
|
||||
|
||||
/* Sum: '<S7>/Sum' incorporates:
|
||||
* Inport: '<Root>/TrueRefHeading'
|
||||
* Inport: '<Root>/WindDirectionTrueFMSSide'
|
||||
*/
|
||||
rtb_Sum_c = WindModeltestfinal_U.WindDirectionTrueFMSSide -
|
||||
WindModeltestfinal_U.TrueRefHeading;
|
||||
|
||||
/* Switch: '<S7>/Switch' incorporates:
|
||||
* Abs: '<S7>/Abs'
|
||||
* Constant: '<S7>/180'
|
||||
* RelationalOperator: '<S7>/Relational Operator'
|
||||
*/
|
||||
if (!(fabs(rtb_Sum_c) <= WindModeltestfinal_P.u80_Value)) {
|
||||
/* Switch: '<S7>/Switch1' incorporates:
|
||||
* Constant: '<S7>/0'
|
||||
* Constant: '<S7>/360'
|
||||
* Constant: '<S7>/360 '
|
||||
* RelationalOperator: '<S7>/Relational Operator1'
|
||||
* Sum: '<S7>/Sum1'
|
||||
* Sum: '<S7>/Sum2'
|
||||
*/
|
||||
if (rtb_Sum_c > WindModeltestfinal_P.u_Value) {
|
||||
rtb_Sum_c -= WindModeltestfinal_P.u60_Value;
|
||||
} else {
|
||||
rtb_Sum_c += WindModeltestfinal_P.u60_Value_c;
|
||||
}
|
||||
|
||||
/* End of Switch: '<S7>/Switch1' */
|
||||
}
|
||||
|
||||
/* End of Switch: '<S7>/Switch' */
|
||||
|
||||
/* Sum: '<S8>/Sum' incorporates:
|
||||
* Constant: '<S4>/Constant'
|
||||
*/
|
||||
rtb_Sum_c -= WindModeltestfinal_P.Constant_Value;
|
||||
|
||||
/* Switch: '<S8>/Switch' incorporates:
|
||||
* Abs: '<S8>/Abs'
|
||||
* Constant: '<S8>/180'
|
||||
* RelationalOperator: '<S8>/Relational Operator'
|
||||
*/
|
||||
if (!(fabs(rtb_Sum_c) <= WindModeltestfinal_P.u80_Value_e)) {
|
||||
/* Switch: '<S8>/Switch1' incorporates:
|
||||
* Constant: '<S8>/0'
|
||||
* Constant: '<S8>/360'
|
||||
* Constant: '<S8>/360 '
|
||||
* RelationalOperator: '<S8>/Relational Operator1'
|
||||
* Sum: '<S8>/Sum1'
|
||||
* Sum: '<S8>/Sum2'
|
||||
*/
|
||||
if (rtb_Sum_c > WindModeltestfinal_P.u_Value_l) {
|
||||
rtb_Sum_c -= WindModeltestfinal_P.u60_Value_g;
|
||||
} else {
|
||||
rtb_Sum_c += WindModeltestfinal_P.u60_Value_e;
|
||||
}
|
||||
|
||||
/* End of Switch: '<S8>/Switch1' */
|
||||
}
|
||||
|
||||
/* End of Switch: '<S8>/Switch' */
|
||||
|
||||
/* Switch: '<S9>/Switch' incorporates:
|
||||
* Constant: '<S9>/0 double'
|
||||
* RelationalOperator: '<S9>/Relational Operator'
|
||||
*/
|
||||
if (rtb_Sum_c >= WindModeltestfinal_P.udouble_Value) {
|
||||
/* Outport: '<Root>/WindDirection' incorporates:
|
||||
* Abs: '<S9>/Abs'
|
||||
* Constant: '<S1>/WindDirectionResC'
|
||||
* Constant: '<S9>/0.5 double'
|
||||
* Product: '<S9>/Divide'
|
||||
* Product: '<S9>/Product'
|
||||
* Rounding: '<S9>/Rounding Function'
|
||||
* Sum: '<S9>/Sum'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindDirection = floor(fabs(rtb_Sum_c /
|
||||
WindModeltestfinal_P.WindDirectionResC_Value) +
|
||||
WindModeltestfinal_P.u5double_Value) *
|
||||
WindModeltestfinal_P.WindDirectionResC_Value;
|
||||
} else {
|
||||
/* Outport: '<Root>/WindDirection' incorporates:
|
||||
* Abs: '<S9>/Abs'
|
||||
* Constant: '<S1>/WindDirectionResC'
|
||||
* Constant: '<S9>/0.5 double'
|
||||
* Product: '<S9>/Divide'
|
||||
* Product: '<S9>/Product'
|
||||
* Rounding: '<S9>/Rounding Function'
|
||||
* Sum: '<S9>/Sum'
|
||||
* UnaryMinus: '<S9>/Unary Minus'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindDirection = -(floor(fabs(rtb_Sum_c /
|
||||
WindModeltestfinal_P.WindDirectionResC_Value) +
|
||||
WindModeltestfinal_P.u5double_Value) *
|
||||
WindModeltestfinal_P.WindDirectionResC_Value);
|
||||
}
|
||||
|
||||
/* End of Switch: '<S9>/Switch' */
|
||||
|
||||
/* Switch: '<S10>/Switch' incorporates:
|
||||
* Abs: '<S10>/Abs'
|
||||
* Constant: '<S10>/0 double'
|
||||
* Constant: '<S10>/0.5 double'
|
||||
* Constant: '<S1>/WindSpeedResC'
|
||||
* Inport: '<Root>/WindSpeedFMSSide'
|
||||
* Product: '<S10>/Divide'
|
||||
* Product: '<S10>/Product'
|
||||
* RelationalOperator: '<S10>/Relational Operator'
|
||||
* Rounding: '<S10>/Rounding Function'
|
||||
* Sum: '<S10>/Sum'
|
||||
* UnaryMinus: '<S10>/Unary Minus'
|
||||
*/
|
||||
if (WindModeltestfinal_U.WindSpeedFMSSide >=
|
||||
WindModeltestfinal_P.udouble_Value_c) {
|
||||
rtb_Sum_c = floor(fabs(WindModeltestfinal_U.WindSpeedFMSSide /
|
||||
WindModeltestfinal_P.WindSpeedResC_Value) +
|
||||
WindModeltestfinal_P.u5double_Value_c) *
|
||||
WindModeltestfinal_P.WindSpeedResC_Value;
|
||||
} else {
|
||||
rtb_Sum_c = -(floor(fabs(WindModeltestfinal_U.WindSpeedFMSSide /
|
||||
WindModeltestfinal_P.WindSpeedResC_Value) +
|
||||
WindModeltestfinal_P.u5double_Value_c) *
|
||||
WindModeltestfinal_P.WindSpeedResC_Value);
|
||||
}
|
||||
|
||||
/* End of Switch: '<S10>/Switch' */
|
||||
|
||||
/* Switch: '<S5>/Switch' incorporates:
|
||||
* Constant: '<S1>/WindSpeedMaxC'
|
||||
* RelationalOperator: '<S5>/Relational Operator'
|
||||
*/
|
||||
if (rtb_Sum_c >= WindModeltestfinal_P.WindSpeedMaxC_Value) {
|
||||
/* Outport: '<Root>/WindSpeed' */
|
||||
WindModeltestfinal_Y.WindSpeed = WindModeltestfinal_P.WindSpeedMaxC_Value;
|
||||
} else {
|
||||
/* Outport: '<Root>/WindSpeed' */
|
||||
WindModeltestfinal_Y.WindSpeed = rtb_Sum_c;
|
||||
}
|
||||
|
||||
/* End of Switch: '<S5>/Switch' */
|
||||
|
||||
/* Outport: '<Root>/WindDirectionColor' incorporates:
|
||||
* Inport: '<Root>/FMSColor'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindDirectionColor = WindModeltestfinal_U.FMSColor;
|
||||
|
||||
/* Outport: '<Root>/WindSpeedColor' incorporates:
|
||||
* Inport: '<Root>/FMSColor'
|
||||
*/
|
||||
WindModeltestfinal_Y.WindSpeedColor = WindModeltestfinal_U.FMSColor;
|
||||
|
||||
/* Update for Memory: '<S6>/Memory' */
|
||||
// WindModeltestfinal_DW.Memory_PreviousInput = rtb_Switch_i;
|
||||
|
||||
/* Matfile logging */
|
||||
|
||||
/* signal main to stop simulation */
|
||||
{ /* Sample time: [0.1s, 0.0s] */
|
||||
if ((rtmGetTFinal(WindModeltestfinal_M)!=-1) &&
|
||||
!((rtmGetTFinal(WindModeltestfinal_M)-
|
||||
WindModeltestfinal_M->Timing.taskTime0) >
|
||||
WindModeltestfinal_M->Timing.taskTime0 * (DBL_EPSILON))) {
|
||||
rtmSetErrorStatus(WindModeltestfinal_M, "Simulation finished");
|
||||
}
|
||||
}
|
||||
|
||||
/* Update absolute time for base rate */
|
||||
/* The "clockTick0" counts the number of times the code of this task has
|
||||
* been executed. The absolute time is the multiplication of "clockTick0"
|
||||
* and "Timing.stepSize0". Size of "clockTick0" ensures timer will not
|
||||
* overflow during the application lifespan selected.
|
||||
* Timer of this task consists of two 32 bit unsigned integers.
|
||||
* The two integers represent the low bits Timing.clockTick0 and the high bits
|
||||
* Timing.clockTickH0. When the low bit overflows to 0, the high bits increment.
|
||||
*/
|
||||
if (!(++WindModeltestfinal_M->Timing.clockTick0)) {
|
||||
++WindModeltestfinal_M->Timing.clockTickH0;
|
||||
}
|
||||
|
||||
WindModeltestfinal_M->Timing.taskTime0 =
|
||||
WindModeltestfinal_M->Timing.clockTick0 *
|
||||
WindModeltestfinal_M->Timing.stepSize0 +
|
||||
WindModeltestfinal_M->Timing.clockTickH0 *
|
||||
WindModeltestfinal_M->Timing.stepSize0 * 4294967296.0;
|
||||
}
|
||||
|
||||
/* Model initialize function */
|
||||
void WindModeltestfinal_initialize(void)
|
||||
{
|
||||
/* Registration code */
|
||||
|
||||
/* initialize non-finites */
|
||||
rt_InitInfAndNaN(sizeof(float));
|
||||
|
||||
/* initialize real-time model */
|
||||
(void) memset((void *)WindModeltestfinal_M, 0,
|
||||
sizeof(RT_MODEL_WindModeltestfinal_T));
|
||||
rtmSetTFinal(WindModeltestfinal_M, 100.0);
|
||||
WindModeltestfinal_M->Timing.stepSize0 = 0.1;
|
||||
|
||||
|
||||
|
||||
/* Setup for data logging */
|
||||
|
||||
|
||||
/*
|
||||
* Set pointers to the data and signal info for each output
|
||||
*/
|
||||
|
||||
|
||||
/* states (dwork) */
|
||||
memset(&WindModeltestfinal_DW, 0,sizeof(DW_WindModeltestfinal_T));
|
||||
|
||||
/* external inputs */
|
||||
memset(&WindModeltestfinal_U, 0, sizeof(ExtU_WindModeltestfinal_T));
|
||||
|
||||
/* external outputs */
|
||||
(void) memset((void *)&WindModeltestfinal_Y, 0,
|
||||
sizeof(ExtY_WindModeltestfinal_T));
|
||||
|
||||
/* Matfile logging */
|
||||
|
||||
|
||||
/* InitializeConditions for Memory: '<S6>/Memory' */
|
||||
// WindModeltestfinal_DW.Memory_PreviousInput =
|
||||
// WindModeltestfinal_P.Memory_InitialCondition;
|
||||
}
|
||||
|
||||
/* Model terminate function */
|
||||
void WindModeltestfinal_terminate(void)
|
||||
{
|
||||
/* (no terminate code required) */
|
||||
}
|
||||
@ -0,0 +1,151 @@
|
||||
/*
|
||||
* WindModeltestfinal_data.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
#include "WindModeltestfinal.h"
|
||||
#include "WindModeltestfinal_private.h"
|
||||
|
||||
/* Block parameters (default storage) */
|
||||
P_WindModeltestfinal_T WindModeltestfinal_P = {
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S7>/360'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 360
|
||||
* Referenced by: '<S7>/360 '
|
||||
*/
|
||||
360.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S7>/0'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S8>/360'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 360
|
||||
* Referenced by: '<S8>/360 '
|
||||
*/
|
||||
360.0,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S8>/0'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 5
|
||||
* Referenced by: '<S1>/WindSpeedMinC'
|
||||
*/
|
||||
5.0,
|
||||
|
||||
/* Expression: 7
|
||||
* Referenced by: '<S1>/WindSpeedUpperHystC'
|
||||
*/
|
||||
7.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S7>/180'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S4>/Constant'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 180
|
||||
* Referenced by: '<S8>/180'
|
||||
*/
|
||||
180.0,
|
||||
|
||||
/* Expression: 1
|
||||
* Referenced by: '<S1>/WindDirectionResC'
|
||||
*/
|
||||
1.0,
|
||||
|
||||
/* Expression: 0.5
|
||||
* Referenced by: '<S9>/0.5 double'
|
||||
*/
|
||||
0.5,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S9>/0 double'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Expression: 255
|
||||
* Referenced by: '<S1>/WindSpeedMaxC'
|
||||
*/
|
||||
255.0,
|
||||
|
||||
/* Expression: 1
|
||||
* Referenced by: '<S1>/WindSpeedResC'
|
||||
*/
|
||||
1.0,
|
||||
|
||||
/* Expression: 0.5
|
||||
* Referenced by: '<S10>/0.5 double'
|
||||
*/
|
||||
0.5,
|
||||
|
||||
/* Expression: 0
|
||||
* Referenced by: '<S10>/0 double'
|
||||
*/
|
||||
0.0,
|
||||
|
||||
/* Computed Parameter: PFDMenuType_Value
|
||||
* Referenced by: '<S3>/PFDMenuType'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypeTCAS_Value
|
||||
* Referenced by: '<S3>/MFDModeType = TCAS'
|
||||
*/
|
||||
3U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypePLAN_Value
|
||||
* Referenced by: '<S3>/MFDModeType = PLAN'
|
||||
*/
|
||||
2U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypePPSN_Value
|
||||
* Referenced by: '<S3>/MFDModeType=PPSN'
|
||||
*/
|
||||
1U,
|
||||
|
||||
/* Computed Parameter: MFDModeTypeBLANK_Value
|
||||
* Referenced by: '<S3>/MFDModeType= BLANK'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: MFDMenuType_Value
|
||||
* Referenced by: '<S3>/MFDMenuType'
|
||||
*/
|
||||
0U,
|
||||
|
||||
/* Computed Parameter: AFDConfigurationTypePFD_Value
|
||||
* Referenced by: '<S3>/AFDConfigurationType PFD'
|
||||
*/
|
||||
1U,
|
||||
|
||||
/* Computed Parameter: Memory_InitialCondition
|
||||
* Referenced by: '<S6>/Memory'
|
||||
*/
|
||||
0
|
||||
};
|
||||
@ -0,0 +1,114 @@
|
||||
/**********************************************
|
||||
Copyright @Avic 2024 All Rights Reserved
|
||||
File Name: main.c
|
||||
File Description:ÌṩÖ÷³ÌÐòÈë¿Úmain
|
||||
Author:tanjiaxin
|
||||
Creation Date:2024-10-9
|
||||
History:
|
||||
1.Date:2024-11-7
|
||||
Author:xuming
|
||||
Modification: Ôö¼ÓÎļþÐòÑÔ
|
||||
************************************************/
|
||||
|
||||
/*****************FILE INCLUSION**********************/
|
||||
#include "MPC5646C.h"
|
||||
#include "common.h"
|
||||
#include "nvram.h"
|
||||
#include "spi.h"
|
||||
#include "wdg.h"
|
||||
#include "lquart.h"
|
||||
#include "pubit.h"
|
||||
#include "ibit.h"
|
||||
#include "pll.h"
|
||||
#include "atp.h"
|
||||
#include "spi_driver.h"
|
||||
|
||||
#include "test.h"
|
||||
#include "WindModeltestfinal.h"
|
||||
|
||||
|
||||
|
||||
/*****************MACRO DEFINITIONS**********************/
|
||||
|
||||
#define WM_BUFFER_SIZE 200
|
||||
|
||||
|
||||
/*****************TYPE DECLARATIONS**********************/
|
||||
|
||||
|
||||
|
||||
/*****************VARIABLE DEFINITIONS**********************/
|
||||
char WM_data_pg[WM_BUFFER_SIZE];
|
||||
uint8_t fix_step = 1;
|
||||
|
||||
extern ExtY_WindModeltestfinal_T WindModeltestfinal_Y;
|
||||
|
||||
/*****************FUNCTION DECLARATIONS**********************/
|
||||
|
||||
void WM_data_pakeage(ExtY_WindModeltestfinal_T* final,char* out_data)
|
||||
{
|
||||
uint32_t temp32 = 0;
|
||||
float temp_f = 0.0;
|
||||
int temp_L=0,size_d = 0;
|
||||
|
||||
temp32 = final->WindVisible;
|
||||
snprintf(out_data, WM_BUFFER_SIZE, "WindVisible: %s,", temp32);
|
||||
temp_L = strlen(out_data);
|
||||
size_d = WM_BUFFER_SIZE;
|
||||
|
||||
temp32 = final->WindDirectionColor;
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindDirectionColor: %s,", temp32);
|
||||
temp_L = strlen(out_data);
|
||||
|
||||
temp_f = final->WindSpeed;
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeed: %s,", temp_f);
|
||||
temp_L = strlen(out_data);
|
||||
|
||||
temp32 = final->WindSpeedColor;
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeedColor: %s,", temp32);
|
||||
temp_L = strlen(out_data);
|
||||
|
||||
temp_f = final->WindDirection;
|
||||
snprintf(out_data+temp_L, WM_BUFFER_SIZE-temp_L, "WindSpeedColor: %s/r/n", temp_f);
|
||||
temp_L = strlen(out_data);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
int main(void) {
|
||||
pll_120M();
|
||||
|
||||
lq_serial_init(120000000, 0, 115200); // ´®¿Ú³õʼ»¯
|
||||
|
||||
pu_BIT(); // Éϵç×Ô¼ì
|
||||
|
||||
initDSPI_gpio(); // SPI³õʼ»¯
|
||||
delay_spi(10); // ÑÓ³Ù
|
||||
|
||||
ATP_menu(); // µ÷ÓÃATP²Ëµ¥
|
||||
|
||||
WindModeltestfinal_initialize();
|
||||
|
||||
fix_step = 1;
|
||||
|
||||
//test_menu();
|
||||
|
||||
/* Loop forever */
|
||||
while(1){
|
||||
delay_spi(30000);
|
||||
if(fix_step == 1){
|
||||
fix_step = 0;
|
||||
memset(WM_data_pg,0,sizeof(WM_data_pg));//clear buff
|
||||
WindModeltestfinal_step();//out:WindModeltestfinal_Y
|
||||
WM_data_pakeage(&WindModeltestfinal_Y,WM_data_pg);//data package
|
||||
lq_serial_putstr(0,WM_data_pg);
|
||||
fix_step = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,140 @@
|
||||
/*
|
||||
* rtGetInf.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finite, Inf
|
||||
*/
|
||||
#include "rtGetInf.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
/*
|
||||
* Initialize rtInf needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetInf(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
float inf = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
inf = rtGetInfF();
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
inf = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
inf = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return inf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtInfF needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetInfF(void)
|
||||
{
|
||||
IEEESingle infF;
|
||||
infF.wordL.wordLuint = 0x7F800000U;
|
||||
return infF.wordL.wordLreal;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtMinusInf needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetMinusInf(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
float minf = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
minf = rtGetMinusInfF();
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
minf = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF00000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
minf = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return minf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtMinusInfF needed by the generated code.
|
||||
* Inf is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetMinusInfF(void)
|
||||
{
|
||||
IEEESingle minfF;
|
||||
minfF.wordL.wordLuint = 0xFF800000U;
|
||||
return minfF.wordL.wordLreal;
|
||||
}
|
||||
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* rtGetNaN.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finite, NaN
|
||||
*/
|
||||
#include "rtGetNaN.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
/*
|
||||
* Initialize rtNaN needed by the generated code.
|
||||
* NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
float rtGetNaN(void)
|
||||
{
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
float nan = 0.0;
|
||||
if (bitsPerReal == 32U) {
|
||||
nan = rtGetNaNF();
|
||||
} else {
|
||||
uint16_T one = 1U;
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0xFFF80000U;
|
||||
tmpVal.bitVal.words.wordL = 0x00000000U;
|
||||
nan = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
union {
|
||||
BigEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.bitVal.words.wordH = 0x7FFFFFFFU;
|
||||
tmpVal.bitVal.words.wordL = 0xFFFFFFFFU;
|
||||
nan = tmpVal.fltVal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nan;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize rtNaNF needed by the generated code.
|
||||
* NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
real32_T rtGetNaNF(void)
|
||||
{
|
||||
IEEESingle nanF = { { 0 } };
|
||||
|
||||
uint16_T one = 1U;
|
||||
enum {
|
||||
LittleEndian,
|
||||
BigEndian
|
||||
} machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
|
||||
switch (machByteOrder) {
|
||||
case LittleEndian:
|
||||
{
|
||||
nanF.wordL.wordLuint = 0xFFC00000U;
|
||||
break;
|
||||
}
|
||||
|
||||
case BigEndian:
|
||||
{
|
||||
nanF.wordL.wordLuint = 0x7FFFFFFFU;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return nanF.wordL.wordLreal;
|
||||
}
|
||||
@ -0,0 +1,90 @@
|
||||
/*
|
||||
* rt_nonfinite.c
|
||||
*
|
||||
* Code generation for model "WindModeltestfinal".
|
||||
*
|
||||
* Model version : 1.86
|
||||
* Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
|
||||
* C source code generated on : Wed Apr 9 14:29:01 2025
|
||||
*
|
||||
* Target selection: grt.tlc
|
||||
* Note: GRT includes extra infrastructure and instrumentation for prototyping
|
||||
* Embedded hardware selection: Intel->x86-64 (Windows64)
|
||||
* Code generation objectives: Unspecified
|
||||
* Validation result: Not run
|
||||
*/
|
||||
|
||||
/*
|
||||
* Abstract:
|
||||
* Function to initialize non-finites,
|
||||
* (Inf, NaN and -Inf).
|
||||
*/
|
||||
#include "rt_nonfinite.h"
|
||||
#include "rtGetNaN.h"
|
||||
#include "rtGetInf.h"
|
||||
#define NumBitsPerChar 8U
|
||||
|
||||
float rtInf;
|
||||
float rtMinusInf;
|
||||
float rtNaN;
|
||||
real32_T rtInfF;
|
||||
real32_T rtMinusInfF;
|
||||
real32_T rtNaNF;
|
||||
|
||||
/*
|
||||
* Initialize the rtInf, rtMinusInf, and rtNaN needed by the
|
||||
* generated code. NaN is initialized as non-signaling. Assumes IEEE.
|
||||
*/
|
||||
void rt_InitInfAndNaN(size_t realSize)
|
||||
{
|
||||
(void) (realSize);
|
||||
rtNaN = rtGetNaN();
|
||||
rtNaNF = rtGetNaNF();
|
||||
rtInf = rtGetInf();
|
||||
rtInfF = rtGetInfF();
|
||||
rtMinusInf = rtGetMinusInf();
|
||||
rtMinusInfF = rtGetMinusInfF();
|
||||
}
|
||||
|
||||
/* Test if value is infinite */
|
||||
boolean_T rtIsInf(float value)
|
||||
{
|
||||
return (boolean_T)((value==rtInf || value==rtMinusInf) ? 1U : 0U);
|
||||
}
|
||||
|
||||
/* Test if single-precision value is infinite */
|
||||
boolean_T rtIsInfF(real32_T value)
|
||||
{
|
||||
return (boolean_T)(((value)==rtInfF || (value)==rtMinusInfF) ? 1U : 0U);
|
||||
}
|
||||
|
||||
/* Test if value is not a number */
|
||||
boolean_T rtIsNaN(float value)
|
||||
{
|
||||
boolean_T result = (boolean_T) 0;
|
||||
size_t bitsPerReal = sizeof(float) * (NumBitsPerChar);
|
||||
if (bitsPerReal == 32U) {
|
||||
result = rtIsNaNF((real32_T)value);
|
||||
} else {
|
||||
union {
|
||||
LittleEndianIEEEDouble bitVal;
|
||||
float fltVal;
|
||||
} tmpVal;
|
||||
|
||||
tmpVal.fltVal = value;
|
||||
result = (boolean_T)((tmpVal.bitVal.words.wordH & 0x7FF00000) == 0x7FF00000 &&
|
||||
( (tmpVal.bitVal.words.wordH & 0x000FFFFF) != 0 ||
|
||||
(tmpVal.bitVal.words.wordL != 0) ));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Test if single-precision value is not a number */
|
||||
boolean_T rtIsNaNF(real32_T value)
|
||||
{
|
||||
IEEESingle tmp;
|
||||
tmp.wordL.wordLreal = value;
|
||||
return (boolean_T)( (tmp.wordL.wordLuint & 0x7F800000) == 0x7F800000 &&
|
||||
(tmp.wordL.wordLuint & 0x007FFFFF) != 0 );
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 14:50:01
|
||||
Original File: output/test_output_fixed_detection/original_code/WindModeltestfinal__d3b72bcf_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20250925_145001.c
|
||||
Total Processing Time: 176.43s
|
||||
API Time: 176.37s
|
||||
CBMC Time: 0.05s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_c7hfrmq7/WindModeltestfinal_3c49a623.c line 304: /tmp/cbmc_c7hfrmq7/WindModeltestfinal_3c49a623.c:304:3: error: unterminated comment
|
||||
304 | /* Switch: '<S10>/Switch' incorporates:
|
||||
| ^
|
||||
GCC preprocessing failed
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,22 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 15:03:20
|
||||
Original File: output/test_output_fixed_detection/original_code/WindModeltestfinal__d3b72bcf_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20250925_150320.c
|
||||
Total Processing Time: 178.75s
|
||||
API Time: 178.70s
|
||||
CBMC Time: 0.05s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_g19e8mvg/WindModeltestfinal_30498afc.c line 308: /tmp/cbmc_g19e8mvg/WindModeltestfinal_30498afc.c:308:3: error: unterminated comment
|
||||
308 | /* Switch: '<S10>/Switch' incorporates:
|
||||
| ^
|
||||
GCC preprocessing failed
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-10-01 00:10:25
|
||||
Original File: output/test_output_fixed_detection/original_code/WindModeltestfinal__d3b72bcf_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20251001_001024.c
|
||||
Total Processing Time: 135.16s
|
||||
API Time: 135.03s
|
||||
CBMC Time: 0.13s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking WindModeltestfinal_0d6534b2
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,19 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 14:48:30
|
||||
Original File: output/test_output_fixed_detection/original_code/WindModeltestfinal_data__b6221792_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20250925_144830.c
|
||||
Total Processing Time: 85.30s
|
||||
API Time: 85.24s
|
||||
CBMC Time: 0.06s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_1ppznjxb/WindModeltestfinal_data_7d174a06.c line 155: syntax error before '.'
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,19 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 15:02:08
|
||||
Original File: output/test_output_fixed_detection/original_code/WindModeltestfinal_data__b6221792_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20250925_150208.c
|
||||
Total Processing Time: 106.82s
|
||||
API Time: 106.76s
|
||||
CBMC Time: 0.06s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_mw893uc4/WindModeltestfinal_data_8c401d52.c line 155: syntax error before '.'
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-10-01 00:10:25
|
||||
Original File: output/test_output_fixed_detection/original_code/WindModeltestfinal_data__b6221792_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20251001_001024.c
|
||||
Total Processing Time: 135.15s
|
||||
API Time: 135.03s
|
||||
CBMC Time: 0.12s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking WindModeltestfinal_data_3c9ecd13
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,23 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 14:48:25
|
||||
Original File: output/test_output_fixed_detection/original_code/main__f16070c3_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20250925_144825.c
|
||||
Total Processing Time: 80.77s
|
||||
API Time: 80.73s
|
||||
CBMC Time: 0.04s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c line 14: /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c:14:10: fatal error: MPC5646C.h: 没有那个文件或目录
|
||||
14 | #include "MPC5646C.h"
|
||||
| ^~~~~~~~~~~~
|
||||
compilation terminated.
|
||||
GCC preprocessing failed
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,23 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 15:01:40
|
||||
Original File: output/test_output_fixed_detection/original_code/main__f16070c3_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20250925_150140.c
|
||||
Total Processing Time: 78.56s
|
||||
API Time: 78.52s
|
||||
CBMC Time: 0.03s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_wwuwk42w/main_0da782ec.c line 14: /tmp/cbmc_wwuwk42w/main_0da782ec.c:14:10: fatal error: MPC5646C.h: 没有那个文件或目录
|
||||
14 | #include "MPC5646C.h"
|
||||
| ^~~~~~~~~~~~
|
||||
compilation terminated.
|
||||
GCC preprocessing failed
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-10-01 00:10:25
|
||||
Original File: output/test_output_fixed_detection/original_code/main__f16070c3_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20251001_001024.c
|
||||
Total Processing Time: 135.15s
|
||||
API Time: 135.02s
|
||||
CBMC Time: 0.13s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking main_3029acd2
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 14:48:32
|
||||
Original File: output/test_output_fixed_detection/original_code/rtGetInf__12decf94_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20250925_144832.c
|
||||
Total Processing Time: 88.16s
|
||||
API Time: 88.10s
|
||||
CBMC Time: 0.05s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetInf_fcf15e71
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,25 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 15:01:30
|
||||
Original File: output/test_output_fixed_detection/original_code/rtGetInf__12decf94_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20250925_150130.c
|
||||
Total Processing Time: 68.57s
|
||||
API Time: 68.52s
|
||||
CBMC Time: 0.05s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetInf_4735b761
|
||||
file /tmp/cbmc_m2rzg77p/rtGetInf_4735b761.c line 73 function rtGetInf: function '__CPROVER_isnormal' is not declared
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-10-01 00:10:25
|
||||
Original File: output/test_output_fixed_detection/original_code/rtGetInf__12decf94_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20251001_001025.c
|
||||
Total Processing Time: 135.15s
|
||||
API Time: 135.03s
|
||||
CBMC Time: 0.12s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetInf_b8eedfd6
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,26 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 14:47:58
|
||||
Original File: output/test_output_fixed_detection/original_code/rtGetNaN__dee5911b_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20250925_144758.c
|
||||
Total Processing Time: 53.34s
|
||||
API Time: 53.29s
|
||||
CBMC Time: 0.05s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetNaN_0a261652
|
||||
file /tmp/cbmc_qkcfmukk/rtGetNaN_0a261652.c line 37 function rtGetNaN: function '__CPROVER_isnormal' is not declared
|
||||
file /tmp/cbmc_qkcfmukk/rtGetNaN_0a261652.c line 37 function rtGetNaN: function '__CPROVER_iszero' is not declared
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 15:01:16
|
||||
Original File: output/test_output_fixed_detection/original_code/rtGetNaN__dee5911b_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20250925_150116.c
|
||||
Total Processing Time: 54.44s
|
||||
API Time: 54.39s
|
||||
CBMC Time: 0.05s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetNaN_1d9b1f90
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-10-01 00:10:25
|
||||
Original File: output/test_output_fixed_detection/original_code/rtGetNaN__dee5911b_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20251001_001025.c
|
||||
Total Processing Time: 135.15s
|
||||
API Time: 135.02s
|
||||
CBMC Time: 0.12s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetNaN_15342e50
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,28 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 14:48:11
|
||||
Original File: output/test_output_fixed_detection/original_code/rt_nonfinite__02d9e270_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20250925_144811.c
|
||||
Total Processing Time: 67.07s
|
||||
API Time: 67.01s
|
||||
CBMC Time: 0.06s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rt_nonfinite_a34994fc
|
||||
file /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 52 function rt_InitInfAndNaN: function '__CPROVER_isnan' is not declared
|
||||
file /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 54 function rt_InitInfAndNaN: function '__CPROVER_isnormal' is not declared
|
||||
file /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 64 function rtIsInf: function '__CPROVER_isfinite' is not declared
|
||||
file /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 65 function rtIsInf: function '__CPROVER_isinf' is not declared
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-09-25 15:01:19
|
||||
Original File: output/test_output_fixed_detection/original_code/rt_nonfinite__02d9e270_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20250925_150119.c
|
||||
Total Processing Time: 57.20s
|
||||
API Time: 57.15s
|
||||
CBMC Time: 0.04s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rt_nonfinite_817adf67
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,24 @@
|
||||
CBMC SpecGen File Processing Summary
|
||||
============================================================
|
||||
Processing Time: 2025-10-01 00:10:25
|
||||
Original File: output/test_output_fixed_detection/original_code/rt_nonfinite__02d9e270_original.c
|
||||
Generated File: output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20251001_001025.c
|
||||
Total Processing Time: 135.15s
|
||||
API Time: 135.03s
|
||||
CBMC Time: 0.11s
|
||||
============================================================
|
||||
|
||||
Verification Status: SUCCESS
|
||||
✅ Verification successful - all assertions passed
|
||||
|
||||
========================================
|
||||
CBMC Verification Output:
|
||||
----------------------------------------
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rt_nonfinite_422b4908
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,14 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20250925_145001.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.05s
|
||||
Total Time: 176.43s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_c7hfrmq7/WindModeltestfinal_3c49a623.c line 304: /tmp/cbmc_c7hfrmq7/WindModeltestfinal_3c49a623.c:304:3: error: unterminated comment
|
||||
304 | /* Switch: '<S10>/Switch' incorporates:
|
||||
| ^
|
||||
GCC preprocessing failed
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,14 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20250925_150320.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.05s
|
||||
Total Time: 178.75s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_g19e8mvg/WindModeltestfinal_30498afc.c line 308: /tmp/cbmc_g19e8mvg/WindModeltestfinal_30498afc.c:308:3: error: unterminated comment
|
||||
308 | /* Switch: '<S10>/Switch' incorporates:
|
||||
| ^
|
||||
GCC preprocessing failed
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/WindModeltestfinal__d3b72bcf_with_assertions_20251001_001024.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.13s
|
||||
Total Time: 135.16s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking WindModeltestfinal_0d6534b2
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,11 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20250925_144830.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.06s
|
||||
Total Time: 85.30s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_1ppznjxb/WindModeltestfinal_data_7d174a06.c line 155: syntax error before '.'
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,11 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20250925_150208.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.06s
|
||||
Total Time: 106.82s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_mw893uc4/WindModeltestfinal_data_8c401d52.c line 155: syntax error before '.'
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/WindModeltestfinal_data__b6221792_with_assertions_20251001_001024.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.12s
|
||||
Total Time: 135.15s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking WindModeltestfinal_data_3c9ecd13
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,15 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20250925_144825.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.04s
|
||||
Total Time: 80.77s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c line 14: /tmp/cbmc_ss6z0hw6/main_ea3fa80c.c:14:10: fatal error: MPC5646C.h: 没有那个文件或目录
|
||||
14 | #include "MPC5646C.h"
|
||||
| ^~~~~~~~~~~~
|
||||
compilation terminated.
|
||||
GCC preprocessing failed
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,15 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20250925_150140.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.03s
|
||||
Total Time: 78.56s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
file /tmp/cbmc_wwuwk42w/main_0da782ec.c line 14: /tmp/cbmc_wwuwk42w/main_0da782ec.c:14:10: fatal error: MPC5646C.h: 没有那个文件或目录
|
||||
14 | #include "MPC5646C.h"
|
||||
| ^~~~~~~~~~~~
|
||||
compilation terminated.
|
||||
GCC preprocessing failed
|
||||
PARSING ERROR
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/main__f16070c3_with_assertions_20251001_001024.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.13s
|
||||
Total Time: 135.15s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking main_3029acd2
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20250925_144832.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.05s
|
||||
Total Time: 88.16s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetInf_fcf15e71
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,17 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20250925_150130.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.05s
|
||||
Total Time: 68.57s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetInf_4735b761
|
||||
file /tmp/cbmc_m2rzg77p/rtGetInf_4735b761.c line 73 function rtGetInf: function '__CPROVER_isnormal' is not declared
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rtGetInf__12decf94_with_assertions_20251001_001025.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.12s
|
||||
Total Time: 135.15s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetInf_b8eedfd6
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,18 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20250925_144758.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.05s
|
||||
Total Time: 53.34s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetNaN_0a261652
|
||||
file /tmp/cbmc_qkcfmukk/rtGetNaN_0a261652.c line 37 function rtGetNaN: function '__CPROVER_isnormal' is not declared
|
||||
file /tmp/cbmc_qkcfmukk/rtGetNaN_0a261652.c line 37 function rtGetNaN: function '__CPROVER_iszero' is not declared
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20250925_150116.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.05s
|
||||
Total Time: 54.44s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetNaN_1d9b1f90
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rtGetNaN__dee5911b_with_assertions_20251001_001025.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.12s
|
||||
Total Time: 135.15s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rtGetNaN_15342e50
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,20 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20250925_144811.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.06s
|
||||
Total Time: 67.07s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rt_nonfinite_a34994fc
|
||||
file /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 52 function rt_InitInfAndNaN: function '__CPROVER_isnan' is not declared
|
||||
file /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 54 function rt_InitInfAndNaN: function '__CPROVER_isnormal' is not declared
|
||||
file /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 64 function rtIsInf: function '__CPROVER_isfinite' is not declared
|
||||
file /tmp/cbmc_qq9bj1j9/rt_nonfinite_a34994fc.c line 65 function rtIsInf: function '__CPROVER_isinf' is not declared
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20250925_150119.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.04s
|
||||
Total Time: 57.20s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rt_nonfinite_817adf67
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,16 @@
|
||||
CBMC Verification Results
|
||||
==================================================
|
||||
File: output/test_output_fixed_detection/generated_code/rt_nonfinite__02d9e270_with_assertions_20251001_001025.c
|
||||
Status: SUCCESS
|
||||
CBMC Time: 0.11s
|
||||
Total Time: 135.15s
|
||||
==================================================
|
||||
|
||||
CBMC version 6.7.1 (cbmc-6.7.1) 64-bit x86_64 linux
|
||||
Type-checking rt_nonfinite_422b4908
|
||||
Generating GOTO Program
|
||||
Adding CPROVER library (x86_64)
|
||||
Removal of function pointers and virtual functions
|
||||
Generic Property Instrumentation
|
||||
Starting Bounded Model Checking
|
||||
the program has no entry point
|
||||
@ -0,0 +1,74 @@
|
||||
#!/bin/bash
|
||||
|
||||
# CBMC SpecGen 完整流程一键测试脚本
|
||||
# 实现从代码输入到验证结果的完整自动化流程
|
||||
|
||||
echo "🚀 CBMC SpecGen 完整流程测试"
|
||||
echo "================================="
|
||||
|
||||
# 检查Python环境
|
||||
if ! command -v python3 &> /dev/null; then
|
||||
echo "❌ Python3 未安装"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查CBMC
|
||||
if ! command -v cbmc &> /dev/null; then
|
||||
echo "❌ CBMC 未安装"
|
||||
echo "请安装CBMC: sudo apt-get install cbmc"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查API密钥文件
|
||||
if [ ! -f "api_key.txt" ]; then
|
||||
echo "❌ API密钥文件不存在: api_key.txt"
|
||||
echo "请创建API密钥文件"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查测试文件
|
||||
if [ ! -f "testfiles/simple_test.c" ]; then
|
||||
echo "❌ 测试文件不存在: testfiles/simple_test.c"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 创建输出目录
|
||||
mkdir -p output
|
||||
|
||||
# 运行完整测试
|
||||
echo "📥 输入文件: testfiles/simple_test.c"
|
||||
echo "📤 输出目录: output"
|
||||
echo ""
|
||||
|
||||
# 运行Python脚本
|
||||
python3 complete_flow_test.py --input testfiles/simple_test.c --verbose
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo ""
|
||||
echo "✅ 完整流程测试成功完成!"
|
||||
|
||||
# 显示生成的文件
|
||||
echo ""
|
||||
echo "📁 生成的文件:"
|
||||
ls -la output/ | tail -n +4
|
||||
|
||||
# 获取最新生成的文件
|
||||
LATEST_ASSERTION=$(ls -t output/*_with_assertions_*.c | head -1)
|
||||
LATEST_RESULT=$(ls -t output/*_verification_result_*.txt | head -1)
|
||||
LATEST_SUMMARY=$(ls -t output/*_summary_*.txt | head -1)
|
||||
|
||||
echo ""
|
||||
echo "📄 最新生成的文件:"
|
||||
echo " 断言代码: $LATEST_ASSERTION"
|
||||
echo " 验证结果: $LATEST_RESULT"
|
||||
echo " 测试摘要: $LATEST_SUMMARY"
|
||||
|
||||
echo ""
|
||||
echo "📋 测试摘要内容:"
|
||||
cat "$LATEST_SUMMARY"
|
||||
|
||||
else
|
||||
echo ""
|
||||
echo "❌ 完整流程测试失败!"
|
||||
exit 1
|
||||
fi
|
||||
@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
# Setup script for CBMC SpecGen virtual environment
|
||||
|
||||
echo "Setting up CBMC SpecGen environment..."
|
||||
|
||||
# Create virtual environment
|
||||
if [ ! -d "venv" ]; then
|
||||
echo "Creating virtual environment..."
|
||||
python3 -m venv venv
|
||||
else
|
||||
echo "Virtual environment already exists."
|
||||
fi
|
||||
|
||||
# Activate virtual environment
|
||||
echo "Activating virtual environment..."
|
||||
source venv/bin/activate
|
||||
|
||||
# Install dependencies
|
||||
echo "Installing dependencies..."
|
||||
pip install --upgrade pip
|
||||
pip install requests
|
||||
|
||||
# Check if API key is set
|
||||
if [ ! -f "api_key.txt" ] && [ -z "$DEEPSEEK_API_KEY" ]; then
|
||||
echo "Warning: No API key found."
|
||||
echo "Please set your DeepSeek API key:"
|
||||
echo "1. Export as environment variable: export DEEPSEEK_API_KEY=your_key"
|
||||
echo "2. Or create api_key.txt file with your key"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Setup complete!"
|
||||
echo "Virtual environment is active and ready to use."
|
||||
echo ""
|
||||
echo "Test commands:"
|
||||
echo " python test_generation_step.py --input testfiles/simple_test.c --verbose"
|
||||
echo " python test_generation_step.py --input testfiles/array_sum.c --output output.c"
|
||||
echo ""
|
||||
echo "To deactivate: deactivate"
|
||||
echo "To reactivate later: source venv/bin/activate"
|
||||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,132 @@
|
||||
import argparse
|
||||
import os
|
||||
import time
|
||||
import signal
|
||||
|
||||
from util.deepseek_wrapper import request_deepseek_engine, create_deepseek_config
|
||||
from util.prompt_format import FORMAT_INIT_PROMPT, FORMAT_REFINE_PROMPT
|
||||
from util.util import file2str, parse_code_from_reply
|
||||
from util.token_counter import count_config_token
|
||||
from util.cbmc_runner import validate_cbmc
|
||||
|
||||
from generation_prompt import create_generation_prompt_config
|
||||
from refinement_prompt import create_specialized_patcher_prompt_config, gen_extra_guidance, extract_err_type
|
||||
|
||||
def token_limit_fitter(config, token_limit=4090):
|
||||
res = config
|
||||
while(count_config_token(res) > token_limit):
|
||||
res['messages'] = res['messages'][3:len(res['messages'])]
|
||||
res['messages'].insert(0, config['messages'][0])
|
||||
return res
|
||||
|
||||
class TimeoutException(Exception):
|
||||
pass
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutException
|
||||
|
||||
signal.signal(signal.SIGALRM, timeout_handler)
|
||||
|
||||
# validate_cbmc is now imported from util.cbmc_runner
|
||||
|
||||
def config2str(config):
|
||||
res = ""
|
||||
for message in config["messages"]:
|
||||
res += "{role}: {content}\n".format(role=message['role'], content=message['content'])
|
||||
return res
|
||||
|
||||
def print_config(config):
|
||||
print(config2str(config))
|
||||
|
||||
def print_msg(message):
|
||||
print("{r}:{c}".format(r=message['role'], c=message['content']))
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--input", type=str, default="")
|
||||
parser.add_argument("--key_file", type=str, default="api_key.txt")
|
||||
parser.add_argument("--max_iterations", type=int, default=20)
|
||||
parser.add_argument("--verbose", action='store_true')
|
||||
args = parser.parse_args()
|
||||
|
||||
if not os.access(args.input, os.R_OK):
|
||||
print("Cannot open input file {filename}".format(filename=args.input))
|
||||
exit(-1)
|
||||
classname = args.input.split('/')[-1].split('.')[0]
|
||||
|
||||
input_code = file2str(args.input)
|
||||
|
||||
current_time_str = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime(time.time()))
|
||||
os.makedirs(os.path.join(os.getcwd(), 'logs'), exist_ok=True)
|
||||
f_log = open(os.path.abspath(".") + "/logs/log-{name}-{time_str}.txt".format(name=classname, time_str=current_time_str), "w")
|
||||
|
||||
# Candidate Generation Phase
|
||||
config = {}
|
||||
current_code = input_code
|
||||
err_info = ""
|
||||
for i in range(1, args.max_iterations+1):
|
||||
print("=============== Iteration {num} ===============".format(num=i))
|
||||
if i == 1:
|
||||
config = create_generation_prompt_config(input_code, classname)
|
||||
print_config(config)
|
||||
ds_config = create_deepseek_config(config['messages'])
|
||||
ret = request_deepseek_engine(ds_config)
|
||||
print("assistant:", ret['choices'][0]['message']['content'])
|
||||
current_code = parse_code_from_reply(ret['choices'][0]['message']['content'])
|
||||
current_code = current_code.strip()
|
||||
ds_config['messages'].append(
|
||||
{
|
||||
'role': 'assistant',
|
||||
'content': "```\n{code}\n```".format(code=current_code)
|
||||
}
|
||||
)
|
||||
else:
|
||||
refine_msg = {
|
||||
'role': 'user',
|
||||
'content': FORMAT_REFINE_PROMPT.format(err_info=err_info)
|
||||
}
|
||||
refine_msg['content'] += gen_extra_guidance(err_info)
|
||||
ds_config['messages'].append(refine_msg)
|
||||
print_msg(refine_msg)
|
||||
token_limit_fitter(ds_config, 3000)
|
||||
ret = request_deepseek_engine(ds_config)
|
||||
print("assistant:", ret['choices'][0]['message']['content'])
|
||||
current_code = parse_code_from_reply(ret['choices'][0]['message']['content'])
|
||||
current_code = current_code.strip()
|
||||
ds_config['messages'].append(
|
||||
{
|
||||
'role': 'assistant',
|
||||
'content': "```\n{code}\n```".format(code=current_code)
|
||||
}
|
||||
)
|
||||
f_log.write("==============================\n")
|
||||
f_log.write(current_code + "\n")
|
||||
err_info = validate_cbmc(current_code, args.input)
|
||||
f_log.write("==============================\n")
|
||||
f_log.write(err_info + "\n")
|
||||
if err_info == "":
|
||||
break
|
||||
# time.sleep(20)
|
||||
|
||||
f_log.close()
|
||||
|
||||
os.makedirs(os.path.abspath(".") + "/output", exist_ok=True)
|
||||
# Determine output file extension based on input
|
||||
if args.input.endswith('.c'):
|
||||
ext = '.c'
|
||||
elif args.input.endswith('.cpp') or args.input.endswith('.cc') or args.input.endswith('.cxx'):
|
||||
ext = '.cpp'
|
||||
else:
|
||||
ext = '.c' # default to C
|
||||
|
||||
output_filename = classname + ext
|
||||
if os.path.exists(os.path.abspath(".") + "/output/" + output_filename):
|
||||
index = 1
|
||||
while os.path.exists(os.path.abspath(".") + "/output/" + output_filename):
|
||||
index = index + 1
|
||||
output_filename = classname + ext + " ({num})".format(num=str(index))
|
||||
with open(os.path.join("./output/", output_filename), 'w') as f:
|
||||
f.write(current_code)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -0,0 +1,32 @@
|
||||
from util.deepseek_wrapper import create_deepseek_config
|
||||
from util.prompt_format import FORMAT_GENERATION_PROMPT
|
||||
from util.util import file2str
|
||||
|
||||
|
||||
def create_generation_prompt_config(input_code, filename):
|
||||
"""
|
||||
Create generation prompt configuration for CBMC specification generation.
|
||||
|
||||
Args:
|
||||
input_code (str): Source code to generate specifications for
|
||||
filename (str): File name for C/C++ files
|
||||
|
||||
Returns:
|
||||
dict: DeepSeek API configuration with messages
|
||||
"""
|
||||
return create_generation_prompt_config_c(input_code, filename)
|
||||
|
||||
def create_generation_prompt_config_c(input_code, filename):
|
||||
msg_base = {
|
||||
'role': 'system',
|
||||
'content': 'You are a CBMC assertion generator for C/C++ programs.'
|
||||
}
|
||||
messages = [msg_base]
|
||||
|
||||
# For C/C++ files, skip oracle examples and directly create the user request
|
||||
msg_request = {
|
||||
'role': 'user',
|
||||
'content': FORMAT_GENERATION_PROMPT.format(src_code=input_code)
|
||||
}
|
||||
messages.append(msg_request)
|
||||
return create_deepseek_config(messages)
|
||||
@ -0,0 +1,166 @@
|
||||
import argparse
|
||||
import os
|
||||
import time
|
||||
from util.cbmc_runner import validate_cbmc
|
||||
|
||||
def str2file(str_content, filename):
|
||||
with open(filename, "w") as f:
|
||||
f.write(str_content)
|
||||
|
||||
def file2str(filename):
|
||||
res = ""
|
||||
with open(filename, "r") as f:
|
||||
for line in f.readlines():
|
||||
res = res + line
|
||||
return res
|
||||
|
||||
def extract_blank_prefix(string):
|
||||
string_stripped = string.strip()
|
||||
if len(string_stripped) > 0:
|
||||
return string.split(string_stripped)[0]
|
||||
else:
|
||||
return string
|
||||
|
||||
# validate_cbmc is now imported from util.cbmc_runner
|
||||
|
||||
def read_annotations_instr():
|
||||
annotations_path = os.path.abspath(".") + "/tmp/houdini_output/log/annotations.instr"
|
||||
if not os.access(annotations_path, os.R_OK):
|
||||
print("Error: Failed to generate candidate annotation set\n")
|
||||
return []
|
||||
res_list = []
|
||||
with open(annotations_path, "r") as f:
|
||||
for line in f.readlines():
|
||||
line = line.strip()
|
||||
tmp_list = line.split("'")
|
||||
content = tmp_list[1]
|
||||
for part in tmp_list[2:len(tmp_list)-1]:
|
||||
content = content + "'" + part
|
||||
tmp_list = tmp_list[0].split()
|
||||
lineno = int(tmp_list[-3])
|
||||
if content.find("Explicating default constructor") != -1 or content.find("*/final/*") != -1 or content.find("requires false;") != -1:
|
||||
continue
|
||||
tmp_dict = {
|
||||
"lineno": lineno,
|
||||
"content": content
|
||||
}
|
||||
res_list.append(tmp_dict)
|
||||
return res_list
|
||||
|
||||
def gen_annotation(code, filename):
|
||||
# Determine file extension
|
||||
if filename.endswith('.c'):
|
||||
ext = '.c'
|
||||
elif filename.endswith('.cpp') or filename.endswith('.cc') or filename.endswith('.cxx'):
|
||||
ext = '.cpp'
|
||||
else:
|
||||
ext = '.c' # default to C
|
||||
|
||||
tmp_filename = os.path.abspath(".") + "/tmp/{filename}{ext}".format(filename=filename, ext=ext)
|
||||
str2file(code, tmp_filename)
|
||||
outdir = os.path.abspath(".") + "/tmp/houdini_output"
|
||||
cmd = "./ESCTools2/Houdini/annotationGen -outdir " + outdir + " " + tmp_filename + " > ./tmp.log"
|
||||
print(cmd)
|
||||
os.system(cmd)
|
||||
|
||||
def merge_annotation_into_code(annotation_list, code):
|
||||
code_list = code.split('\n')
|
||||
res_code_list = []
|
||||
i, j = 0, 0
|
||||
while i < len(annotation_list) and j < len(code_list):
|
||||
if annotation_list[i]["lineno"] <= j + 1:
|
||||
res_code_list.append(
|
||||
{
|
||||
"is_annotation": True,
|
||||
"content": extract_blank_prefix(code_list[j]) + "//@ " + annotation_list[i]["content"]
|
||||
}
|
||||
)
|
||||
i = i + 1
|
||||
else:
|
||||
res_code_list.append(
|
||||
{
|
||||
"is_annotation": False,
|
||||
"content": code_list[j]
|
||||
}
|
||||
)
|
||||
j = j + 1
|
||||
while i < len(annotation_list):
|
||||
res_code_list.append(
|
||||
{
|
||||
"is_annotation": True,
|
||||
"content": extract_blank_prefix(code_list[j]) + annotation_list[i]["content"]
|
||||
}
|
||||
)
|
||||
i = i + 1
|
||||
while j < len(code_list):
|
||||
res_code_list.append(
|
||||
{
|
||||
"is_annotation": False,
|
||||
"content": code_list[j]
|
||||
}
|
||||
)
|
||||
j = j + 1
|
||||
return res_code_list
|
||||
|
||||
def extract_lineno_from_err_info(err_info):
|
||||
temp_list = []
|
||||
err_list = []
|
||||
err_info_list = err_info.split('\n')
|
||||
for line in err_info_list:
|
||||
if line.strip() == "^":
|
||||
err_list.append(temp_list)
|
||||
temp_list = []
|
||||
else:
|
||||
temp_list.append(line)
|
||||
lineno_list = []
|
||||
for err in err_list:
|
||||
lineno_list.append(int(err[0].split(":")[1]))
|
||||
return lineno_list
|
||||
|
||||
def myhoudini_algorithm(code, input_path):
|
||||
current_time_str = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime(time.time()))
|
||||
os.makedirs(os.path.join(os.getcwd(), 'logs_myhoudini'), exist_ok=True)
|
||||
from pathlib import Path
|
||||
log_name = Path(input_path).stem
|
||||
f_log = open(os.path.abspath(".") + "/logs_myhoudini/log-{name}-{time_str}.txt".format(name=log_name, time_str=current_time_str), "w")
|
||||
|
||||
gen_annotation(code, input_path)
|
||||
annotation_list = read_annotations_instr()
|
||||
merged_list = merge_annotation_into_code(annotation_list, code)
|
||||
err_info = "anything"
|
||||
merged_code = ""
|
||||
# Main loop of houdini algorithm
|
||||
while True:
|
||||
merged_code = ""
|
||||
for line in merged_list:
|
||||
merged_code = merged_code + line['content'] + '\n'
|
||||
print(merged_code)
|
||||
f_log.write(merged_code + "\n")
|
||||
err_info = validate_cbmc(merged_code, input_path)
|
||||
print(err_info)
|
||||
f_log.write(err_info + "\n")
|
||||
if err_info == "":
|
||||
break
|
||||
else:
|
||||
flag = False
|
||||
refuted_lineno_list = extract_lineno_from_err_info(err_info)
|
||||
for lineno in refuted_lineno_list:
|
||||
if merged_list[lineno - 1]["is_annotation"] == True:
|
||||
merged_list.pop(lineno - 1)
|
||||
flag = True
|
||||
break
|
||||
if not flag:
|
||||
break
|
||||
return merged_code
|
||||
|
||||
|
||||
def myhoudini_main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--input", type=str, default="")
|
||||
args = parser.parse_args()
|
||||
classname = args.input.split('/')[-1].split('.')[0]
|
||||
code = file2str(args.input)
|
||||
myhoudini_algorithm(code, args.input)
|
||||
|
||||
if __name__ == "__main__":
|
||||
myhoudini_main()
|
||||
@ -0,0 +1,50 @@
|
||||
from util.chatgpt_wrapper import create_chatgpt_config
|
||||
from util.prompt_format import FORMAT_REFINEMENT_PROMPT
|
||||
from util.util import file2str
|
||||
|
||||
def gen_extra_guidance(err_info):
|
||||
if 'CBMC' in err_info and ('array bounds' in err_info or 'bounds check' in err_info):
|
||||
return "For array bounds errors, add bounds checking with __CPROVER_assume to ensure array indices are within valid range."
|
||||
elif 'CBMC' in err_info and ('pointer' in err_info or 'dereference' in err_info):
|
||||
return "For pointer safety errors, add NULL checks and ensure proper pointer validation before dereferencing."
|
||||
elif 'CBMC' in err_info and ('overflow' in err_info or 'arithmetic' in err_info):
|
||||
return "For arithmetic overflow errors, add range checking with __CPROVER_assume to prevent integer overflow/underflow."
|
||||
elif 'CBMC' in err_info and ('assertion' in err_info or 'failed' in err_info):
|
||||
return "For assertion failures, review the logic and adjust preconditions/postconditions to ensure all assumptions are valid."
|
||||
else:
|
||||
return "Review the CBMC error output and add appropriate __CPROVER_assert and __CPROVER_assume statements to ensure program correctness."
|
||||
|
||||
|
||||
def extract_err_type(err_info):
|
||||
prompt_list = []
|
||||
keyword_dict = {
|
||||
"divide by zero": "divide_by_zero",
|
||||
"array bounds": "array_bounds",
|
||||
"bounds check": "array_bounds",
|
||||
"pointer": "pointer_safety",
|
||||
"dereference": "pointer_safety",
|
||||
"overflow": "overflow",
|
||||
"underflow": "underflow",
|
||||
"arithmetic": "arithmetic_safety",
|
||||
"assertion": "assertion_failure",
|
||||
"failed": "assertion_failure",
|
||||
}
|
||||
for key in keyword_dict:
|
||||
if key.lower() in err_info.lower():
|
||||
prompt_list.append(keyword_dict[key])
|
||||
return prompt_list
|
||||
|
||||
def create_specialized_patcher_prompt_config(original_code, err_info):
|
||||
msg_base = {
|
||||
'role': 'system',
|
||||
'content': 'You are a CBMC assertion generator for C/C++ programs.'
|
||||
}
|
||||
messages = [msg_base]
|
||||
|
||||
msg_request = {
|
||||
'role': 'user',
|
||||
'content': FORMAT_REFINEMENT_PROMPT.format(code=original_code, info=err_info)
|
||||
}
|
||||
msg_request['content'] += gen_extra_guidance(err_info)
|
||||
messages.append(msg_request)
|
||||
return create_chatgpt_config(messages)
|
||||
@ -0,0 +1,138 @@
|
||||
import argparse
|
||||
import os
|
||||
import time
|
||||
import signal
|
||||
|
||||
from util.deepseek_wrapper import request_deepseek_engine, create_deepseek_config
|
||||
from util.prompt_format import FORMAT_REFINEMENT_PROMPT
|
||||
from util.util import file2str, parse_code_from_reply
|
||||
from util.token_counter import count_config_token
|
||||
from util.cbmc_runner import validate_cbmc
|
||||
|
||||
from generation_prompt import create_generation_prompt_config
|
||||
from refinement_prompt import create_specialized_patcher_prompt_config, gen_extra_guidance, extract_err_type
|
||||
|
||||
def token_limit_fitter(config, token_limit=120000):
|
||||
res = config
|
||||
while(count_config_token(res) > token_limit):
|
||||
res['messages'] = res['messages'][3:len(res['messages'])]
|
||||
res['messages'].insert(0, config['messages'][0])
|
||||
return res
|
||||
|
||||
class TimeoutException(Exception):
|
||||
pass
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutException
|
||||
|
||||
signal.signal(signal.SIGALRM, timeout_handler)
|
||||
|
||||
# validate_cbmc is now imported from util.cbmc_runner
|
||||
|
||||
|
||||
|
||||
def config2str(config):
|
||||
res = ""
|
||||
for message in config["messages"]:
|
||||
res += "{role}: {content}\n".format(role=message['role'], content=message['content'])
|
||||
return res
|
||||
|
||||
def print_config(config):
|
||||
print(config2str(config))
|
||||
|
||||
def print_msg(message):
|
||||
print("{r}:{c}".format(r=message['role'], c=message['content']))
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--input", type=str, default="")
|
||||
parser.add_argument("--key_file", type=str, default="api_key.txt")
|
||||
parser.add_argument("--max_iterations", type=int, default=20)
|
||||
parser.add_argument("--verbose", action='store_true')
|
||||
args = parser.parse_args()
|
||||
|
||||
if not os.access(args.input, os.R_OK):
|
||||
print("Cannot open input file {filename}".format(filename=args.input))
|
||||
exit(-1)
|
||||
classname = args.input.split('/')[-1].split('.')[0]
|
||||
|
||||
input_code = file2str(args.input)
|
||||
|
||||
current_time_str = time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime(time.time()))
|
||||
os.makedirs(os.path.join(os.getcwd(), 'logs'), exist_ok=True)
|
||||
f_log = open(os.path.abspath(".") + "/logs/log-{name}-{time_str}.txt".format(name=classname, time_str=current_time_str), "w")
|
||||
|
||||
num_verify = 0
|
||||
|
||||
# Candidate Generation Phase
|
||||
print("=============== Generation Phase ===============")
|
||||
done_flag = False
|
||||
config = {}
|
||||
current_code = input_code.strip()
|
||||
err_info = ""
|
||||
err_types = []
|
||||
for i in range(1, args.max_iterations+1):
|
||||
print("--------------- Iteration {num} ---------------".format(num=i))
|
||||
if i == 1:
|
||||
config = create_generation_prompt_config(input_code, classname)
|
||||
print_config(config)
|
||||
ds_config = create_deepseek_config(config['messages'])
|
||||
ret = request_deepseek_engine(ds_config)
|
||||
print("assistant:", ret['choices'][0]['message']['content'])
|
||||
current_code = parse_code_from_reply(ret['choices'][0]['message']['content'])
|
||||
current_code = current_code.strip()
|
||||
ds_config['messages'].append(
|
||||
{
|
||||
'role': 'assistant',
|
||||
'content': "```\n{code}\n```".format(code=current_code)
|
||||
}
|
||||
)
|
||||
else:
|
||||
err_types = extract_err_type(err_info)
|
||||
if len(err_types) != 0:
|
||||
tmp_config = create_specialized_patcher_prompt_config(current_code, err_info)
|
||||
print_config(tmp_config)
|
||||
ds_config = create_deepseek_config(tmp_config['messages'])
|
||||
ret = request_deepseek_engine(ds_config)
|
||||
print("assistant:", ret['choices'][0]['message']['content'])
|
||||
current_code = parse_code_from_reply(ret['choices'][0]['message']['content'])
|
||||
current_code = current_code.strip()
|
||||
ds_config['messages'][-1]['content'] = "```\n{code}\n```".format(code=current_code)
|
||||
elif err_info.find("LoopInvariant") == -1 and err_info.find("Postcondition") == -1:
|
||||
refine_msg = {
|
||||
'role': 'user',
|
||||
'content': FORMAT_REFINE_PROMPT.format(err_info=err_info)
|
||||
}
|
||||
refine_msg['content'] += gen_extra_guidance(err_info)
|
||||
ds_config['messages'].append(refine_msg)
|
||||
print_msg(refine_msg)
|
||||
token_limit_fitter(ds_config, 3000)
|
||||
ret = request_deepseek_engine(ds_config)
|
||||
print("assistant:", ret['choices'][0]['message']['content'])
|
||||
current_code = parse_code_from_reply(ret['choices'][0]['message']['content'])
|
||||
current_code = current_code.strip()
|
||||
ds_config['messages'].append(
|
||||
{
|
||||
'role': 'assistant',
|
||||
'content': "```\n{code}\n```".format(code=current_code)
|
||||
}
|
||||
)
|
||||
else:
|
||||
done_flag = True
|
||||
break
|
||||
f_log.write(current_code + "\n==============================\n")
|
||||
err_info = validate_cbmc(current_code, args.input)
|
||||
num_verify = num_verify + 1
|
||||
print(err_info)
|
||||
err_types = extract_err_type(err_info)
|
||||
f_log.write(err_info + "\n==============================\n")
|
||||
if err_info == "" or done_flag:
|
||||
break
|
||||
time.sleep(20)
|
||||
|
||||
print("\nFinished. Verifier invoked {num} times".format(num=num_verify))
|
||||
|
||||
f_log.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Binary file not shown.
@ -0,0 +1,898 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Comprehensive test suite for batch processing functionality.
|
||||
Includes unit tests, integration tests, and performance tests.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
import tempfile
|
||||
import shutil
|
||||
import time
|
||||
import json
|
||||
from unittest.mock import Mock, patch, MagicMock
|
||||
from datetime import datetime
|
||||
from typing import List, Dict, Any
|
||||
|
||||
# Add parent directory to path for imports
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from src.tools.batch_processor import BatchProcessor, create_default_config
|
||||
from src.tools.file_job_runner import FileJobRunner, ProcessingResult
|
||||
from src.tools.result_aggregator import ResultAggregator, BatchStatistics
|
||||
from util.rate_limiter import TokenBucketRateLimiter, RateLimiterFactory
|
||||
|
||||
|
||||
class TestRateLimiter(unittest.TestCase):
|
||||
"""Test rate limiting functionality"""
|
||||
|
||||
def setUp(self):
|
||||
self.limiter = TokenBucketRateLimiter(rate=2.0, burst=4)
|
||||
|
||||
def test_token_acquisition_success(self):
|
||||
"""Test successful token acquisition"""
|
||||
self.assertTrue(self.limiter.acquire(timeout=1.0))
|
||||
|
||||
def test_token_acquisition_timeout(self):
|
||||
"""Test token acquisition timeout"""
|
||||
# Drain all tokens
|
||||
for _ in range(4):
|
||||
self.assertTrue(self.limiter.acquire(timeout=0.1))
|
||||
|
||||
# Next acquisition should timeout
|
||||
self.assertFalse(self.limiter.acquire(timeout=0.1))
|
||||
|
||||
def test_can_acquire_check(self):
|
||||
"""Test non-blocking token availability check"""
|
||||
self.assertTrue(self.limiter.can_acquire())
|
||||
|
||||
def test_status_retrieval(self):
|
||||
"""Test status retrieval"""
|
||||
status = self.limiter.get_status()
|
||||
self.assertIn('tokens_available', status)
|
||||
self.assertIn('tokens_capacity', status)
|
||||
self.assertIn('refill_rate', status)
|
||||
|
||||
|
||||
class TestFileJobRunner(unittest.TestCase):
|
||||
"""Test file job runner functionality"""
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.rate_limiter = TokenBucketRateLimiter(rate=1.0, burst=1)
|
||||
self.runner = FileJobRunner(self.rate_limiter, self.temp_dir, verbose=False)
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.temp_dir)
|
||||
|
||||
def test_dry_run_info(self):
|
||||
"""Test dry run information generation"""
|
||||
# Create a test file
|
||||
test_file = os.path.join(self.temp_dir, 'test.c')
|
||||
with open(test_file, 'w') as f:
|
||||
f.write('int main() { return 0; }')
|
||||
|
||||
info = self.runner.get_dry_run_info(test_file)
|
||||
|
||||
self.assertEqual(info['file_path'], test_file)
|
||||
self.assertIn('size_bytes', info)
|
||||
self.assertIn('estimated_processing_time', info)
|
||||
self.assertIn('steps', info)
|
||||
|
||||
def test_dry_run_info_nonexistent_file(self):
|
||||
"""Test dry run with nonexistent file"""
|
||||
info = self.runner.get_dry_run_info('/nonexistent/file.c')
|
||||
self.assertIn('error', info)
|
||||
|
||||
|
||||
class TestResultAggregator(unittest.TestCase):
|
||||
"""Test result aggregation functionality"""
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.aggregator = ResultAggregator('test_batch', self.temp_dir)
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.temp_dir)
|
||||
|
||||
def test_add_result(self):
|
||||
"""Test adding processing results"""
|
||||
result = ProcessingResult(
|
||||
file_path='/test/file.c',
|
||||
status='SUCCESS',
|
||||
api_time=1.0,
|
||||
cbmc_time=2.0,
|
||||
total_time=3.0
|
||||
)
|
||||
self.aggregator.add_result(result)
|
||||
self.assertEqual(len(self.aggregator.results), 1)
|
||||
|
||||
def test_generate_statistics_empty(self):
|
||||
"""Test statistics generation with empty results"""
|
||||
stats = self.aggregator.generate_statistics()
|
||||
self.assertEqual(stats.total_files, 0)
|
||||
self.assertEqual(stats.success_rate, 0.0)
|
||||
|
||||
def test_generate_statistics_with_results(self):
|
||||
"""Test statistics generation with results"""
|
||||
# Add test results
|
||||
results = [
|
||||
ProcessingResult('/test1.c', 'SUCCESS', 1.0, 2.0, 3.0),
|
||||
ProcessingResult('/test2.c', 'API_FAIL', 0.5, 0.0, 0.5),
|
||||
ProcessingResult('/test3.c', 'SUCCESS', 1.5, 2.5, 4.0)
|
||||
]
|
||||
|
||||
for result in results:
|
||||
self.aggregator.add_result(result)
|
||||
|
||||
stats = self.aggregator.generate_statistics()
|
||||
self.assertEqual(stats.total_files, 3)
|
||||
self.assertEqual(stats.successful_files, 2)
|
||||
self.assertEqual(stats.failed_files, 1)
|
||||
self.assertAlmostEqual(stats.success_rate, 66.67, places=1)
|
||||
|
||||
def test_error_summary(self):
|
||||
"""Test error summary generation"""
|
||||
results = [
|
||||
ProcessingResult('/test1.c', 'SUCCESS', 1.0, 2.0, 3.0),
|
||||
ProcessingResult('/test2.c', 'API_FAIL', 0.5, 0.0, 0.5, "API timeout"),
|
||||
ProcessingResult('/test3.c', 'API_FAIL', 0.3, 0.0, 0.3, "API rate limit"),
|
||||
]
|
||||
|
||||
for result in results:
|
||||
self.aggregator.add_result(result)
|
||||
|
||||
summary = self.aggregator.generate_error_summary()
|
||||
self.assertEqual(summary['status_counts']['SUCCESS'], 1)
|
||||
self.assertEqual(summary['status_counts']['API_FAIL'], 2)
|
||||
|
||||
def test_export_formats(self):
|
||||
"""Test export to different formats"""
|
||||
# Add test result
|
||||
result = ProcessingResult(
|
||||
file_path='/test/file.c',
|
||||
status='SUCCESS',
|
||||
api_time=1.0,
|
||||
cbmc_time=2.0,
|
||||
total_time=3.0
|
||||
)
|
||||
self.aggregator.add_result(result)
|
||||
self.aggregator.end_time = datetime.now()
|
||||
|
||||
# Test JSON export
|
||||
json_path = self.aggregator.export_to_json('test.json')
|
||||
self.assertTrue(os.path.exists(json_path))
|
||||
|
||||
# Test CSV export
|
||||
csv_path = self.aggregator.export_to_csv('test.csv')
|
||||
self.assertTrue(os.path.exists(csv_path))
|
||||
|
||||
# Test save all reports
|
||||
reports = self.aggregator.save_all_reports()
|
||||
self.assertIn('markdown', reports)
|
||||
self.assertIn('json', reports)
|
||||
self.assertIn('csv', reports)
|
||||
self.assertIn('executive_summary', reports)
|
||||
|
||||
|
||||
class TestBatchProcessor(unittest.TestCase):
|
||||
"""Test batch processor functionality"""
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.config = create_default_config()
|
||||
self.config['max_workers'] = 1 # Use single worker for tests
|
||||
self.processor = BatchProcessor(self.config)
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.temp_dir)
|
||||
|
||||
def test_file_discovery(self):
|
||||
"""Test file discovery functionality"""
|
||||
# Create test directory structure
|
||||
test_files = [
|
||||
'test1.c',
|
||||
'test2.cpp',
|
||||
'test3.h',
|
||||
'test4.txt', # Should be excluded
|
||||
'subdir/test5.c'
|
||||
]
|
||||
|
||||
for file_path in test_files:
|
||||
full_path = os.path.join(self.temp_dir, file_path)
|
||||
os.makedirs(os.path.dirname(full_path), exist_ok=True)
|
||||
with open(full_path, 'w') as f:
|
||||
f.write(f'// {file_path}\nint main() {{ return 0; }}')
|
||||
|
||||
# Discover files
|
||||
source_files = self.processor.discover_source_files(self.temp_dir)
|
||||
|
||||
# Should find .c, .cpp, .h files but not .txt
|
||||
expected_files = {'test1.c', 'test2.cpp', 'test3.h', 'test5.c'}
|
||||
found_files = {os.path.basename(f) for f in source_files}
|
||||
|
||||
self.assertEqual(found_files, expected_files)
|
||||
|
||||
def test_file_discovery_with_patterns(self):
|
||||
"""Test file discovery with custom patterns"""
|
||||
# Create test files
|
||||
test_files = ['test1.c', 'test2.cpp', 'test3.java']
|
||||
for file_path in test_files:
|
||||
full_path = os.path.join(self.temp_dir, file_path)
|
||||
with open(full_path, 'w') as f:
|
||||
f.write(f'// {file_path}')
|
||||
|
||||
# Configure to only include .c files
|
||||
self.config['include_patterns'] = ['*.c']
|
||||
processor = BatchProcessor(self.config)
|
||||
|
||||
source_files = processor.discover_source_files(self.temp_dir)
|
||||
found_files = {os.path.basename(f) for f in source_files}
|
||||
|
||||
self.assertEqual(found_files, {'test1.c'})
|
||||
|
||||
def test_discovery_nonexistent_directory(self):
|
||||
"""Test file discovery with nonexistent directory"""
|
||||
source_files = self.processor.discover_source_files('/nonexistent/directory')
|
||||
self.assertEqual(len(source_files), 0)
|
||||
|
||||
|
||||
class TestIntegrationBatchProcessing(unittest.TestCase):
|
||||
"""Integration tests for batch processing"""
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.output_dir = tempfile.mkdtemp()
|
||||
self.config = create_default_config()
|
||||
self.config['max_workers'] = 1 # Single worker for predictable tests
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.temp_dir)
|
||||
shutil.rmtree(self.output_dir)
|
||||
|
||||
def create_test_files(self, count: int = 3) -> List[str]:
|
||||
"""Create test C files"""
|
||||
test_files = []
|
||||
for i in range(count):
|
||||
file_path = os.path.join(self.temp_dir, f'test{i}.c')
|
||||
with open(file_path, 'w') as f:
|
||||
f.write(f'''
|
||||
#include <assert.h>
|
||||
|
||||
int test_function(int x) {{
|
||||
assert(x >= 0);
|
||||
return x * 2;
|
||||
}}
|
||||
|
||||
int main() {{
|
||||
return test_function(5);
|
||||
}}
|
||||
''')
|
||||
test_files.append(file_path)
|
||||
return test_files
|
||||
|
||||
@patch('src.tools.file_job_runner.request_deepseek_engine')
|
||||
def test_small_batch_processing(self, mock_api):
|
||||
"""Test processing a small batch of files"""
|
||||
# Create test files
|
||||
test_files = self.create_test_files(2)
|
||||
|
||||
# Mock API response
|
||||
mock_api.return_value = {
|
||||
'choices': [{'message': {'content': '// Generated code with assertions'}}]
|
||||
}
|
||||
|
||||
# Mock CBMC validation
|
||||
with patch('src.tools.file_job_runner.validate_cbmc', return_value=''):
|
||||
# Process batch
|
||||
processor = BatchProcessor(self.config)
|
||||
aggregator = processor.process_batch(self.temp_dir, self.output_dir)
|
||||
|
||||
# Verify results
|
||||
self.assertEqual(len(aggregator.results), 2)
|
||||
stats = aggregator.generate_statistics()
|
||||
self.assertEqual(stats.total_files, 2)
|
||||
|
||||
@patch('src.tools.file_job_runner.request_deepseek_engine')
|
||||
def test_error_handling(self, mock_api):
|
||||
"""Test error handling in batch processing"""
|
||||
# Create test files
|
||||
test_files = self.create_test_files(2)
|
||||
|
||||
# Mock API to fail for first file, succeed for second
|
||||
mock_api.side_effect = [None, {'choices': [{'message': {'content': '// Good code'}}]}]
|
||||
|
||||
# Mock CBMC validation
|
||||
with patch('src.tools.file_job_runner.validate_cbmc', return_value=''):
|
||||
# Process batch
|
||||
processor = BatchProcessor(self.config)
|
||||
aggregator = processor.process_batch(self.temp_dir, self.output_dir)
|
||||
|
||||
# Verify mixed results
|
||||
self.assertEqual(len(aggregator.results), 2)
|
||||
stats = aggregator.generate_statistics()
|
||||
self.assertEqual(stats.api_failures, 1)
|
||||
self.assertEqual(stats.successful_files, 1)
|
||||
|
||||
def test_resume_functionality(self):
|
||||
"""Test resume functionality"""
|
||||
# Create output directory structure
|
||||
generated_dir = os.path.join(self.output_dir, 'generated_code')
|
||||
os.makedirs(generated_dir, exist_ok=True)
|
||||
|
||||
# Create a "processed" file
|
||||
with open(os.path.join(generated_dir, 'test0_with_assertions_20250101_120000.c'), 'w') as f:
|
||||
f.write('// Processed file')
|
||||
|
||||
# Create test files including one that appears processed
|
||||
self.create_test_files(3)
|
||||
|
||||
# Configure resume mode
|
||||
self.config['resume'] = True
|
||||
processor = BatchProcessor(self.config)
|
||||
|
||||
# Check resume state
|
||||
processed_files = processor.check_resume_state(self.output_dir)
|
||||
self.assertEqual(len(processed_files), 1) # Should find test0
|
||||
|
||||
|
||||
class TestPerformance(unittest.TestCase):
|
||||
"""Performance tests for batch processing"""
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.output_dir = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.temp_dir)
|
||||
shutil.rmtree(self.output_dir)
|
||||
|
||||
def create_large_batch(self, count: int = 10) -> List[str]:
|
||||
"""Create a large batch of test files"""
|
||||
test_files = []
|
||||
for i in range(count):
|
||||
file_path = os.path.join(self.temp_dir, f'large_test{i}.c')
|
||||
with open(file_path, 'w') as f:
|
||||
f.write(f'''
|
||||
// Large test file {i}
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define SIZE 100
|
||||
|
||||
int process_array(int arr[SIZE]) {{
|
||||
for (int i = 0; i < SIZE; i++) {{
|
||||
assert(arr[i] >= 0);
|
||||
arr[i] *= 2;
|
||||
}}
|
||||
return 0;
|
||||
}}
|
||||
|
||||
int main() {{
|
||||
int data[SIZE] = {{0}};
|
||||
return process_array(data);
|
||||
}}
|
||||
''')
|
||||
test_files.append(file_path)
|
||||
return test_files
|
||||
|
||||
@patch('src.tools.file_job_runner.request_deepseek_engine')
|
||||
def test_parallel_processing_efficiency(self, mock_api):
|
||||
"""Test that parallel processing is more efficient than sequential"""
|
||||
# Create test files
|
||||
self.create_large_batch(6)
|
||||
|
||||
# Mock API response
|
||||
mock_api.return_value = {
|
||||
'choices': [{'message': {'content': '// Generated code'}}]
|
||||
}
|
||||
|
||||
# Mock CBMC validation
|
||||
with patch('src.tools.file_job_runner.validate_cbmc', return_value=''):
|
||||
# Test with 3 workers
|
||||
config_parallel = create_default_config()
|
||||
config_parallel['max_workers'] = 3
|
||||
processor_parallel = BatchProcessor(config_parallel)
|
||||
|
||||
start_time = time.time()
|
||||
aggregator_parallel = processor_parallel.process_batch(self.temp_dir, self.output_dir)
|
||||
parallel_time = time.time() - start_time
|
||||
|
||||
# Clean output directory
|
||||
shutil.rmtree(self.output_dir)
|
||||
os.makedirs(self.output_dir)
|
||||
|
||||
# Test with 1 worker (sequential)
|
||||
config_sequential = create_default_config()
|
||||
config_sequential['max_workers'] = 1
|
||||
processor_sequential = BatchProcessor(config_sequential)
|
||||
|
||||
start_time = time.time()
|
||||
aggregator_sequential = processor_sequential.process_batch(self.temp_dir, self.output_dir)
|
||||
sequential_time = time.time() - start_time
|
||||
|
||||
# Parallel should be faster (allowing some tolerance for overhead)
|
||||
# This is a rough test since we're mocking API calls
|
||||
self.assertLessEqual(parallel_time, sequential_time * 1.5) # Allow 50% overhead
|
||||
|
||||
|
||||
class TestMockResponses(unittest.TestCase):
|
||||
"""Test with mock API responses"""
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.output_dir = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.temp_dir)
|
||||
shutil.rmtree(self.output_dir)
|
||||
|
||||
def create_mock_response(self, code: str) -> Dict[str, Any]:
|
||||
"""Create a mock API response"""
|
||||
return {
|
||||
'choices': [{'message': {'content': f'```c\n{code}\n```'}}]
|
||||
}
|
||||
|
||||
def test_successful_processing_with_mock(self):
|
||||
"""Test successful processing with mocked API"""
|
||||
# Create test file
|
||||
test_file = os.path.join(self.temp_dir, 'mock_test.c')
|
||||
with open(test_file, 'w') as f:
|
||||
f.write('int test() { return 0; }')
|
||||
|
||||
# Mock response with assertions
|
||||
mock_response = self.create_mock_response('''
|
||||
int test() {
|
||||
__CPROVER_assert(input >= 0, "input must be non-negative");
|
||||
return 0;
|
||||
}
|
||||
''')
|
||||
|
||||
with patch('src.tools.file_job_runner.request_deepseek_engine', return_value=mock_response):
|
||||
with patch('src.tools.file_job_runner.validate_cbmc', return_value=''):
|
||||
config = create_default_config()
|
||||
config['max_workers'] = 1
|
||||
processor = BatchProcessor(config)
|
||||
aggregator = processor.process_batch(self.temp_dir, self.output_dir)
|
||||
|
||||
self.assertEqual(len(aggregator.results), 1)
|
||||
self.assertEqual(aggregator.results[0].status, 'SUCCESS')
|
||||
|
||||
|
||||
class TestFilenameCollisionPrevention(unittest.TestCase):
|
||||
"""Test filename collision prevention functionality"""
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.output_dir = tempfile.mkdtemp()
|
||||
self.rate_limiter = TokenBucketRateLimiter(rate=1.0, burst=1)
|
||||
self.runner = FileJobRunner(self.rate_limiter, self.output_dir, verbose=False)
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.temp_dir)
|
||||
shutil.rmtree(self.output_dir)
|
||||
|
||||
def test_collision_prevention_same_basename_different_dirs(self):
|
||||
"""Test that files with same basename in different directories get unique slugs"""
|
||||
# Create two directories with same filename
|
||||
dir1 = os.path.join(self.temp_dir, 'dir1')
|
||||
dir2 = os.path.join(self.temp_dir, 'dir2')
|
||||
os.makedirs(dir1)
|
||||
os.makedirs(dir2)
|
||||
|
||||
file1 = os.path.join(dir1, 'test.c')
|
||||
file2 = os.path.join(dir2, 'test.c')
|
||||
|
||||
with open(file1, 'w') as f:
|
||||
f.write('int test1() { return 1; }')
|
||||
with open(file2, 'w') as f:
|
||||
f.write('int test2() { return 2; }')
|
||||
|
||||
# Test that get_batch_file_paths generates different slugs
|
||||
from src.core.output_organizer import OutputOrganizer
|
||||
organizer = OutputOrganizer(self.output_dir)
|
||||
|
||||
paths1 = organizer.get_batch_file_paths(file1, self.output_dir, '20250101_120000')
|
||||
paths2 = organizer.get_batch_file_paths(file2, self.output_dir, '20250101_120000')
|
||||
|
||||
# Slugs should be different due to different absolute paths
|
||||
self.assertNotEqual(paths1['slug'], paths2['slug'])
|
||||
|
||||
# Generated filenames should be different
|
||||
self.assertNotEqual(
|
||||
os.path.basename(paths1['generated']),
|
||||
os.path.basename(paths2['generated'])
|
||||
)
|
||||
|
||||
def test_collision_prevention_same_dir_similar_names(self):
|
||||
"""Test that similar filenames in same directory get unique slugs"""
|
||||
# Create files with similar names that could cause collisions
|
||||
file1 = os.path.join(self.temp_dir, 'test_program.c')
|
||||
file2 = os.path.join(self.temp_dir, 'test-program.c')
|
||||
|
||||
with open(file1, 'w') as f:
|
||||
f.write('int test1() { return 1; }')
|
||||
with open(file2, 'w') as f:
|
||||
f.write('int test2() { return 2; }')
|
||||
|
||||
from src.core.output_organizer import OutputOrganizer
|
||||
organizer = OutputOrganizer(self.output_dir)
|
||||
|
||||
paths1 = organizer.get_batch_file_paths(file1, self.output_dir, '20250101_120000')
|
||||
paths2 = organizer.get_batch_file_paths(file2, self.output_dir, '20250101_120000')
|
||||
|
||||
# Slugs should be different
|
||||
self.assertNotEqual(paths1['slug'], paths2['slug'])
|
||||
|
||||
def test_slug_consistency_same_file(self):
|
||||
"""Test that same file always gets same slug"""
|
||||
test_file = os.path.join(self.temp_dir, 'consistent.c')
|
||||
with open(test_file, 'w') as f:
|
||||
f.write('int consistent() { return 0; }')
|
||||
|
||||
from src.core.output_organizer import OutputOrganizer
|
||||
organizer = OutputOrganizer(self.output_dir)
|
||||
|
||||
# Generate paths multiple times
|
||||
paths1 = organizer.get_batch_file_paths(test_file, self.output_dir, '20250101_120000')
|
||||
paths2 = organizer.get_batch_file_paths(test_file, self.output_dir, '20250101_120001')
|
||||
paths3 = organizer.get_batch_file_paths(test_file, self.output_dir, '20250101_120002')
|
||||
|
||||
# Slug should be consistent across timestamps
|
||||
self.assertEqual(paths1['slug'], paths2['slug'])
|
||||
self.assertEqual(paths2['slug'], paths3['slug'])
|
||||
|
||||
def test_slug_length_and_format(self):
|
||||
"""Test that slugs have correct length and format"""
|
||||
test_file = os.path.join(self.temp_dir, 'format_test.c')
|
||||
with open(test_file, 'w') as f:
|
||||
f.write('int format_test() { return 0; }')
|
||||
|
||||
from src.core.output_organizer import OutputOrganizer
|
||||
organizer = OutputOrganizer(self.output_dir)
|
||||
|
||||
paths = organizer.get_batch_file_paths(test_file, self.output_dir, '20250101_120000')
|
||||
|
||||
# Slug should be 8 characters long (SHA1 hash truncated)
|
||||
self.assertEqual(len(paths['slug']), 8)
|
||||
|
||||
# Slug should be hexadecimal
|
||||
self.assertTrue(all(c in '0123456789abcdef' for c in paths['slug']))
|
||||
|
||||
def test_batch_processor_uses_collision_safe_paths(self):
|
||||
"""Test that batch processor correctly uses collision-safe file paths"""
|
||||
# Create multiple files with same basename in different locations
|
||||
test_files = []
|
||||
|
||||
# Same basename in different directories
|
||||
for subdir in ['sub1', 'sub2', 'sub3']:
|
||||
dir_path = os.path.join(self.temp_dir, subdir)
|
||||
os.makedirs(dir_path)
|
||||
file_path = os.path.join(dir_path, 'main.c')
|
||||
with open(file_path, 'w') as f:
|
||||
f.write(f'// {subdir} main function\nint main() {{ return 0; }}')
|
||||
test_files.append(file_path)
|
||||
|
||||
# Mock successful processing
|
||||
mock_response = {'choices': [{'message': {'content': '// Generated code'}}]}
|
||||
|
||||
with patch('src.tools.file_job_runner.request_deepseek_engine', return_value=mock_response):
|
||||
with patch('src.tools.file_job_runner.validate_cbmc', return_value=''):
|
||||
config = create_default_config()
|
||||
config['max_workers'] = 1
|
||||
processor = BatchProcessor(config)
|
||||
aggregator = processor.process_batch(self.temp_dir, self.output_dir)
|
||||
|
||||
# All files should be processed successfully
|
||||
self.assertEqual(len(aggregator.results), 3)
|
||||
for result in aggregator.results:
|
||||
self.assertEqual(result.status, 'SUCCESS')
|
||||
|
||||
# Check that generated files exist and have unique names
|
||||
generated_dir = os.path.join(self.output_dir, 'generated_code')
|
||||
if os.path.exists(generated_dir):
|
||||
generated_files = os.listdir(generated_dir)
|
||||
# Should have 3 unique files (no collisions)
|
||||
self.assertEqual(len(generated_files), 3)
|
||||
# All should contain the slug pattern
|
||||
for filename in generated_files:
|
||||
self.assertIn('__', filename)
|
||||
|
||||
|
||||
class TestResumeFunctionalityEdgeCases(unittest.TestCase):
|
||||
"""Test resume functionality edge cases"""
|
||||
|
||||
def setUp(self):
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.output_dir = tempfile.mkdtemp()
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.temp_dir)
|
||||
shutil.rmtree(self.output_dir)
|
||||
|
||||
def test_resume_with_old_filename_format(self):
|
||||
"""Test resume functionality with old filename format (backward compatibility)"""
|
||||
# Create output directory with old format files
|
||||
generated_dir = os.path.join(self.output_dir, 'generated_code')
|
||||
os.makedirs(generated_dir, exist_ok=True)
|
||||
|
||||
# Create files in old format (without slugs)
|
||||
old_format_files = [
|
||||
'main_with_assertions_20250101_120000.c',
|
||||
'test_with_assertions_20250101_120001.c'
|
||||
]
|
||||
|
||||
for filename in old_format_files:
|
||||
with open(os.path.join(generated_dir, filename), 'w') as f:
|
||||
f.write(f'// Old format file: {filename}')
|
||||
|
||||
# Create corresponding source files
|
||||
source_files = [
|
||||
os.path.join(self.temp_dir, 'main.c'),
|
||||
os.path.join(self.temp_dir, 'test.c')
|
||||
]
|
||||
|
||||
for file_path in source_files:
|
||||
with open(file_path, 'w') as f:
|
||||
f.write(f'// Source file: {os.path.basename(file_path)}\nint main() {{ return 0; }}')
|
||||
|
||||
# Configure resume mode
|
||||
config = create_default_config()
|
||||
config['resume'] = True
|
||||
processor = BatchProcessor(config)
|
||||
|
||||
# Check resume state should handle old format gracefully
|
||||
processed_files = processor.check_resume_state(self.output_dir)
|
||||
|
||||
# Should detect some files as processed (backward compatibility)
|
||||
self.assertGreater(len(processed_files), 0)
|
||||
|
||||
def test_resume_with_mixed_filename_formats(self):
|
||||
"""Test resume with mixed old and new filename formats"""
|
||||
generated_dir = os.path.join(self.output_dir, 'generated_code')
|
||||
os.makedirs(generated_dir, exist_ok=True)
|
||||
|
||||
# Create files in both formats
|
||||
files_to_create = [
|
||||
# Old format
|
||||
'old_main_with_assertions_20250101_120000.c',
|
||||
# New format with slug
|
||||
'newmain__abc12345_with_assertions_20250101_120001.c'
|
||||
]
|
||||
|
||||
for filename in files_to_create:
|
||||
with open(os.path.join(generated_dir, filename), 'w') as f:
|
||||
f.write(f'// Mixed format file: {filename}')
|
||||
|
||||
# Create source files
|
||||
source_files = [
|
||||
os.path.join(self.temp_dir, 'old_main.c'),
|
||||
os.path.join(self.temp_dir, 'newmain.c')
|
||||
]
|
||||
|
||||
for file_path in source_files:
|
||||
with open(file_path, 'w') as f:
|
||||
f.write(f'// Source file: {os.path.basename(file_path)}\nint main() {{ return 0; }}')
|
||||
|
||||
config = create_default_config()
|
||||
config['resume'] = True
|
||||
processor = BatchProcessor(config)
|
||||
|
||||
# Should handle both formats
|
||||
processed_files = processor.check_resume_state(self.output_dir)
|
||||
self.assertGreater(len(processed_files), 0)
|
||||
|
||||
def test_resume_with_corrupted_generated_files(self):
|
||||
"""Test resume functionality when some generated files are corrupted"""
|
||||
generated_dir = os.path.join(self.output_dir, 'generated_code')
|
||||
os.makedirs(generated_dir, exist_ok=True)
|
||||
|
||||
# Create mix of valid and invalid generated files
|
||||
valid_file = 'test1__abc12345_with_assertions_20250101_120000.c'
|
||||
invalid_files = [
|
||||
'incomplete_file.c', # Missing required parts
|
||||
'empty__.c', # Empty basename
|
||||
'no_timestamp__abc12345.c' # Missing timestamp
|
||||
]
|
||||
|
||||
# Create valid file
|
||||
with open(os.path.join(generated_dir, valid_file), 'w') as f:
|
||||
f.write('// Valid generated file')
|
||||
|
||||
# Create invalid files
|
||||
for filename in invalid_files:
|
||||
with open(os.path.join(generated_dir, filename), 'w') as f:
|
||||
f.write('// Invalid file')
|
||||
|
||||
# Should handle corrupted files gracefully
|
||||
config = create_default_config()
|
||||
config['resume'] = True
|
||||
processor = BatchProcessor(config)
|
||||
|
||||
# Should not crash, should return what it can parse
|
||||
processed_files = processor.check_resume_state(self.output_dir)
|
||||
# Should at least detect the valid file
|
||||
self.assertIn('test1', processed_files)
|
||||
|
||||
def test_resume_with_empty_generated_directory(self):
|
||||
"""Test resume functionality with empty generated directory"""
|
||||
generated_dir = os.path.join(self.output_dir, 'generated_code')
|
||||
os.makedirs(generated_dir, exist_ok=True)
|
||||
|
||||
# Empty directory
|
||||
config = create_default_config()
|
||||
config['resume'] = True
|
||||
processor = BatchProcessor(config)
|
||||
|
||||
processed_files = processor.check_resume_state(self.output_dir)
|
||||
self.assertEqual(len(processed_files), 0)
|
||||
|
||||
def test_resume_with_nonexistent_output_directory(self):
|
||||
"""Test resume functionality when output directory doesn't exist"""
|
||||
nonexistent_dir = os.path.join(self.temp_dir, 'nonexistent')
|
||||
|
||||
config = create_default_config()
|
||||
config['resume'] = True
|
||||
processor = BatchProcessor(config)
|
||||
|
||||
# Should handle nonexistent directory gracefully
|
||||
processed_files = processor.check_resume_state(nonexistent_dir)
|
||||
self.assertEqual(len(processed_files), 0)
|
||||
|
||||
def test_resume_case_sensitivity(self):
|
||||
"""Test resume functionality with case-sensitive filenames"""
|
||||
generated_dir = os.path.join(self.output_dir, 'generated_code')
|
||||
os.makedirs(generated_dir, exist_ok=True)
|
||||
|
||||
# Create files with different cases
|
||||
case_files = [
|
||||
'Test__abc12345_with_assertions_20250101_120000.c',
|
||||
'test__def67890_with_assertions_20250101_120001.c',
|
||||
'TEST__ghi24680_with_assertions_20250101_120002.c'
|
||||
]
|
||||
|
||||
for filename in case_files:
|
||||
with open(os.path.join(generated_dir, filename), 'w') as f:
|
||||
f.write(f'// Case test file: {filename}')
|
||||
|
||||
# Create corresponding source files with different cases
|
||||
source_files = [
|
||||
os.path.join(self.temp_dir, 'Test.c'),
|
||||
os.path.join(self.temp_dir, 'test.c'),
|
||||
os.path.join(self.temp_dir, 'TEST.c')
|
||||
]
|
||||
|
||||
for file_path in source_files:
|
||||
with open(file_path, 'w') as f:
|
||||
f.write(f'// Source file: {os.path.basename(file_path)}\nint main() {{ return 0; }}')
|
||||
|
||||
config = create_default_config()
|
||||
config['resume'] = True
|
||||
processor = BatchProcessor(config)
|
||||
|
||||
processed_files = processor.check_resume_state(self.output_dir)
|
||||
|
||||
# Should detect all files (case-sensitive)
|
||||
self.assertEqual(len(processed_files), 3)
|
||||
|
||||
@patch('src.tools.file_job_runner.request_deepseek_engine')
|
||||
def test_resume_skip_processed_files(self, mock_api):
|
||||
"""Test that resume mode actually skips processed files"""
|
||||
# Create source files
|
||||
test_files = []
|
||||
for i in range(3):
|
||||
file_path = os.path.join(self.temp_dir, f'test{i}.c')
|
||||
with open(file_path, 'w') as f:
|
||||
f.write(f'int test{i}() {{ return {i}; }}')
|
||||
test_files.append(file_path)
|
||||
|
||||
# Mark some files as already processed
|
||||
generated_dir = os.path.join(self.output_dir, 'generated_code')
|
||||
os.makedirs(generated_dir, exist_ok=True)
|
||||
|
||||
# Create generated files for test0 and test2 (simulating they were processed)
|
||||
from src.core.output_organizer import OutputOrganizer
|
||||
organizer = OutputOrganizer(self.output_dir)
|
||||
|
||||
for i in [0, 2]:
|
||||
source_file = test_files[i]
|
||||
paths = organizer.get_batch_file_paths(source_file, self.output_dir, '20250101_120000')
|
||||
os.makedirs(os.path.dirname(paths['generated']), exist_ok=True)
|
||||
with open(paths['generated'], 'w') as f:
|
||||
f.write(f'// Already processed file {i}')
|
||||
|
||||
# Configure resume mode
|
||||
config = create_default_config()
|
||||
config['resume'] = True
|
||||
config['max_workers'] = 1
|
||||
|
||||
# Mock API for remaining files
|
||||
mock_api.return_value = {'choices': [{'message': {'content': '// New generated code'}}]}
|
||||
|
||||
with patch('src.tools.file_job_runner.validate_cbmc', return_value=''):
|
||||
processor = BatchProcessor(config)
|
||||
aggregator = processor.process_batch(self.temp_dir, self.output_dir)
|
||||
|
||||
# Should only process test1 (test0 and test2 should be skipped)
|
||||
self.assertEqual(len(aggregator.results), 1)
|
||||
# The processed file should be test1.c
|
||||
processed_basename = os.path.basename(aggregator.results[0].file_path)
|
||||
self.assertEqual(processed_basename, 'test1.c')
|
||||
|
||||
|
||||
def create_test_suite():
|
||||
"""Create comprehensive test suite"""
|
||||
suite = unittest.TestSuite()
|
||||
|
||||
# Add rate limiter tests
|
||||
suite.addTest(unittest.makeSuite(TestRateLimiter))
|
||||
|
||||
# Add file job runner tests
|
||||
suite.addTest(unittest.makeSuite(TestFileJobRunner))
|
||||
|
||||
# Add result aggregator tests
|
||||
suite.addTest(unittest.makeSuite(TestResultAggregator))
|
||||
|
||||
# Add batch processor tests
|
||||
suite.addTest(unittest.makeSuite(TestBatchProcessor))
|
||||
|
||||
# Add integration tests
|
||||
suite.addTest(unittest.makeSuite(TestIntegrationBatchProcessing))
|
||||
|
||||
# Add performance tests (marked as slow)
|
||||
suite.addTest(unittest.makeSuite(TestPerformance))
|
||||
|
||||
# Add mock response tests
|
||||
suite.addTest(unittest.makeSuite(TestMockResponses))
|
||||
|
||||
# Add filename collision prevention tests
|
||||
suite.addTest(unittest.makeSuite(TestFilenameCollisionPrevention))
|
||||
|
||||
# Add resume functionality edge case tests
|
||||
suite.addTest(unittest.makeSuite(TestResumeFunctionalityEdgeCases))
|
||||
|
||||
return suite
|
||||
|
||||
|
||||
def run_tests():
|
||||
"""Run all tests"""
|
||||
print("🧪 Running CBMC SpecGen Batch Processing Tests")
|
||||
print("=" * 60)
|
||||
|
||||
# Create test suite
|
||||
suite = create_test_suite()
|
||||
|
||||
# Run tests
|
||||
runner = unittest.TextTestRunner(verbosity=2)
|
||||
result = runner.run(suite)
|
||||
|
||||
# Print summary
|
||||
print("\n" + "=" * 60)
|
||||
print(f"📊 Test Results:")
|
||||
print(f" Tests run: {result.testsRun}")
|
||||
print(f" Failures: {len(result.failures)}")
|
||||
print(f" Errors: {len(result.errors)}")
|
||||
print(f" Skipped: {len(result.skipped)}")
|
||||
|
||||
if result.failures:
|
||||
print("\n❌ Failures:")
|
||||
for test, traceback in result.failures:
|
||||
print(f" - {test}: {traceback}")
|
||||
|
||||
if result.errors:
|
||||
print("\n💥 Errors:")
|
||||
for test, traceback in result.errors:
|
||||
print(f" - {test}: {traceback}")
|
||||
|
||||
if result.wasSuccessful():
|
||||
print("\n✅ All tests passed!")
|
||||
return 0
|
||||
else:
|
||||
print("\n❌ Some tests failed!")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(run_tests())
|
||||
@ -0,0 +1,94 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test script for the first step of CBMC SpecGen - API generation.
|
||||
This script demonstrates the process of sending C/C++ code to DeepSeek API
|
||||
and receiving back code with CBMC assertions.
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
from util.util import file2str, parse_code_from_reply
|
||||
from generation_prompt import create_generation_prompt_config
|
||||
from util.deepseek_wrapper import request_deepseek_engine
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Test CBMC SpecGen API Generation Step')
|
||||
parser.add_argument('--input', '-i', required=True, help='Input C/C++ file path')
|
||||
parser.add_argument('--output', '-o', help='Output file path (optional)')
|
||||
parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
|
||||
args = parser.parse_args()
|
||||
|
||||
# Validate input file
|
||||
if not os.path.exists(args.input):
|
||||
print(f"Error: Input file '{args.input}' not found")
|
||||
sys.exit(1)
|
||||
|
||||
# Read input code
|
||||
print(f"🔍 Reading input file: {args.input}")
|
||||
original_code = file2str(args.input)
|
||||
|
||||
if args.verbose:
|
||||
print("\n=== ORIGINAL CODE ===")
|
||||
print(original_code)
|
||||
print("=" * 50)
|
||||
|
||||
# Create generation prompt configuration
|
||||
print("📝 Creating generation prompt configuration...")
|
||||
config = create_generation_prompt_config(original_code, args.input)
|
||||
|
||||
if args.verbose:
|
||||
print("\n=== API CONFIGURATION ===")
|
||||
print(f"Model: {config['model']}")
|
||||
print(f"Temperature: {config['temperature']}")
|
||||
print(f"Max tokens: {config['max_tokens']}")
|
||||
print("\n=== MESSAGES SENT TO API ===")
|
||||
for msg in config['messages']:
|
||||
print(f"Role: {msg['role']}")
|
||||
print(f"Content: {msg['content'][:200]}...")
|
||||
print("-" * 30)
|
||||
print("=" * 50)
|
||||
|
||||
# Send request to DeepSeek API
|
||||
print("🚀 Sending request to DeepSeek API...")
|
||||
response = request_deepseek_engine(config)
|
||||
|
||||
if args.verbose:
|
||||
print("\n=== RAW API RESPONSE ===")
|
||||
print(response)
|
||||
print("=" * 50)
|
||||
|
||||
# Parse code from response
|
||||
print("📄 Parsing generated code...")
|
||||
generated_code = parse_code_from_reply(response['choices'][0]['message']['content'])
|
||||
|
||||
if args.verbose:
|
||||
print("\n=== GENERATED CODE WITH CBMC ASSERTIONS ===")
|
||||
print(generated_code)
|
||||
print("=" * 50)
|
||||
|
||||
# Save generated code to file
|
||||
if args.output:
|
||||
with open(args.output, 'w') as f:
|
||||
f.write(generated_code)
|
||||
print(f"💾 Generated code saved to: {args.output}")
|
||||
else:
|
||||
# Generate output filename based on input
|
||||
base_name = os.path.splitext(args.input)[0]
|
||||
output_file = f"{base_name}_with_assertions.c"
|
||||
with open(output_file, 'w') as f:
|
||||
f.write(generated_code)
|
||||
print(f"💾 Generated code saved to: {output_file}")
|
||||
|
||||
print("\n✅ First step demonstration complete!")
|
||||
print("Original C code → API call → Code with CBMC assertions")
|
||||
|
||||
# Show summary
|
||||
print("\n📊 SUMMARY:")
|
||||
print(f"- Input file: {args.input}")
|
||||
print(f"- Output file: {args.output if args.output else base_name + '_with_assertions.c'}")
|
||||
print(f"- Original code lines: {len(original_code.splitlines())}")
|
||||
print(f"- Generated code lines: {len(generated_code.splitlines())}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -0,0 +1,481 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Comprehensive tests for header dependency analysis functionality.
|
||||
"""
|
||||
|
||||
import os
|
||||
import tempfile
|
||||
import shutil
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
import sys
|
||||
import os
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
||||
|
||||
from util.header_utils import HeaderDependencyAnalyzer, create_header_analyzer
|
||||
from util.header_utils import extract_local_includes, collect_file_dependencies, copy_dependencies_to_temp
|
||||
|
||||
|
||||
class TestHeaderDependencyAnalyzer(unittest.TestCase):
|
||||
"""Test cases for HeaderDependencyAnalyzer class"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test environment"""
|
||||
self.test_dir = tempfile.mkdtemp()
|
||||
self.analyzer = create_header_analyzer()
|
||||
|
||||
# Create test files
|
||||
self._create_test_files()
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test environment"""
|
||||
shutil.rmtree(self.test_dir, ignore_errors=True)
|
||||
|
||||
def _create_test_files(self):
|
||||
"""Create test C/C++ files with various include patterns"""
|
||||
|
||||
# Main source file
|
||||
main_c = """
|
||||
#include "utils.h"
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main() {
|
||||
print_config();
|
||||
return 0;
|
||||
}
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, "main.c"), 'w') as f:
|
||||
f.write(main_c)
|
||||
|
||||
# Header file with nested includes
|
||||
utils_h = """
|
||||
#ifndef UTILS_H
|
||||
#define UTILS_H
|
||||
#include "common.h"
|
||||
#include "platform.h"
|
||||
|
||||
void print_config(void);
|
||||
|
||||
#endif
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, "utils.h"), 'w') as f:
|
||||
f.write(utils_h)
|
||||
|
||||
# Config header
|
||||
config_h = """
|
||||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
#define VERSION "1.0"
|
||||
#endif
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, "config.h"), 'w') as f:
|
||||
f.write(config_h)
|
||||
|
||||
# Common header
|
||||
common_h = """
|
||||
#ifndef COMMON_H
|
||||
#define COMMON_H
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, "common.h"), 'w') as f:
|
||||
f.write(common_h)
|
||||
|
||||
# Platform-specific header
|
||||
platform_h = """
|
||||
#ifndef PLATFORM_H
|
||||
#define PLATFORM_H
|
||||
#ifdef _WIN32
|
||||
#include "windows_specific.h"
|
||||
#else
|
||||
#include "unix_specific.h"
|
||||
#endif
|
||||
#endif
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, "platform.h"), 'w') as f:
|
||||
f.write(platform_h)
|
||||
|
||||
# Create subdirectory for testing path resolution
|
||||
subdir = os.path.join(self.test_dir, "include")
|
||||
os.makedirs(subdir)
|
||||
|
||||
subdir_header = """
|
||||
#ifndef SUBDIR_HEADER
|
||||
#define SUBDIR_HEADER
|
||||
void subdir_function(void);
|
||||
#endif
|
||||
"""
|
||||
with open(os.path.join(subdir, "subdir_header.h"), 'w') as f:
|
||||
f.write(subdir_header)
|
||||
|
||||
def test_extract_local_includes_simple(self):
|
||||
"""Test extraction of simple local includes"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
includes = self.analyzer.extract_local_includes(main_c_path)
|
||||
|
||||
expected_includes = ["utils.h", "config.h"]
|
||||
self.assertEqual(set(includes), set(expected_includes))
|
||||
|
||||
def test_extract_local_includes_empty(self):
|
||||
"""Test extraction from file with no local includes"""
|
||||
test_file = os.path.join(self.test_dir, "config.h")
|
||||
includes = self.analyzer.extract_local_includes(test_file)
|
||||
|
||||
self.assertEqual(includes, [])
|
||||
|
||||
def test_extract_local_includes_nonexistent_file(self):
|
||||
"""Test extraction from non-existent file"""
|
||||
includes = self.analyzer.extract_local_includes("nonexistent.c")
|
||||
|
||||
self.assertEqual(includes, [])
|
||||
|
||||
def test_resolve_header_path_relative(self):
|
||||
"""Test header path resolution relative to source file"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
|
||||
# Test resolving utils.h
|
||||
utils_path = self.analyzer.resolve_header_path("utils.h", main_c_path)
|
||||
expected_path = os.path.join(self.test_dir, "utils.h")
|
||||
self.assertEqual(utils_path, expected_path)
|
||||
|
||||
def test_resolve_header_path_nonexistent(self):
|
||||
"""Test resolving non-existent header"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
|
||||
nonexistent_path = self.analyzer.resolve_header_path("nonexistent.h", main_c_path)
|
||||
self.assertIsNone(nonexistent_path)
|
||||
|
||||
def test_resolve_header_path_with_project_root(self):
|
||||
"""Test header path resolution with project root"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
|
||||
# Test with project root as test directory
|
||||
utils_path = self.analyzer.resolve_header_path("utils.h", main_c_path, self.test_dir)
|
||||
expected_path = os.path.join(self.test_dir, "utils.h")
|
||||
self.assertEqual(utils_path, expected_path)
|
||||
|
||||
def test_collect_file_dependencies_simple(self):
|
||||
"""Test collecting file dependencies for simple case"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
|
||||
dependencies = self.analyzer.collect_file_dependencies(main_c_path, self.test_dir)
|
||||
|
||||
# Should include main.c's direct dependencies
|
||||
expected_deps = {
|
||||
os.path.join(self.test_dir, "utils.h"),
|
||||
os.path.join(self.test_dir, "config.h")
|
||||
}
|
||||
self.assertTrue(expected_deps.issubset(dependencies))
|
||||
|
||||
def test_collect_file_dependencies_recursive(self):
|
||||
"""Test recursive dependency collection"""
|
||||
utils_h_path = os.path.join(self.test_dir, "utils.h")
|
||||
|
||||
dependencies = self.analyzer.collect_file_dependencies(utils_h_path, self.test_dir)
|
||||
|
||||
# Should include dependencies of utils.h (not utils.h itself)
|
||||
expected_deps = {
|
||||
os.path.join(self.test_dir, "common.h"),
|
||||
os.path.join(self.test_dir, "platform.h")
|
||||
}
|
||||
self.assertTrue(expected_deps.issubset(dependencies))
|
||||
|
||||
def test_collect_file_dependencies_max_depth(self):
|
||||
"""Test dependency collection with max depth limit"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
|
||||
# Limit to depth 0 (should only get direct dependencies, not their dependencies)
|
||||
dependencies = self.analyzer.collect_file_dependencies(main_c_path, self.test_dir, max_depth=0)
|
||||
|
||||
# Should only include direct dependencies of main.c
|
||||
expected_deps = {
|
||||
os.path.join(self.test_dir, "utils.h"),
|
||||
os.path.join(self.test_dir, "config.h")
|
||||
}
|
||||
self.assertEqual(dependencies, expected_deps)
|
||||
|
||||
def test_collect_file_dependencies_circular(self):
|
||||
"""Test handling of circular dependencies"""
|
||||
# Create circular dependency
|
||||
header_a = os.path.join(self.test_dir, "header_a.h")
|
||||
header_b = os.path.join(self.test_dir, "header_b.h")
|
||||
|
||||
with open(header_a, 'w') as f:
|
||||
f.write('#include "header_b.h"\n')
|
||||
with open(header_b, 'w') as f:
|
||||
f.write('#include "header_a.h"\n')
|
||||
|
||||
# Should handle circular dependencies without infinite recursion
|
||||
dependencies = self.analyzer.collect_file_dependencies(header_a, self.test_dir)
|
||||
|
||||
# Should include both headers
|
||||
self.assertIn(header_a, dependencies)
|
||||
self.assertIn(header_b, dependencies)
|
||||
|
||||
def test_copy_dependencies_to_temp_flat(self):
|
||||
"""Test copying dependencies to temp directory without preserving structure"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
|
||||
dependencies = self.analyzer.collect_file_dependencies(main_c_path, self.test_dir)
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
copied_files = self.analyzer.copy_dependencies_to_temp(
|
||||
dependencies, temp_dir, preserve_structure=False
|
||||
)
|
||||
|
||||
# Should have copied all dependencies
|
||||
self.assertEqual(len(copied_files), len(dependencies))
|
||||
|
||||
# Files should be in temp directory root
|
||||
for dest_path in copied_files.values():
|
||||
self.assertTrue(dest_path.startswith(temp_dir))
|
||||
self.assertEqual(os.path.dirname(dest_path), temp_dir)
|
||||
|
||||
def test_copy_dependencies_to_temp_with_structure(self):
|
||||
"""Test copying dependencies while preserving directory structure"""
|
||||
subdir = os.path.join(self.test_dir, "include")
|
||||
subdir_header = os.path.join(subdir, "subdir_header.h")
|
||||
|
||||
dependencies = {subdir_header}
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
copied_files = self.analyzer.copy_dependencies_to_temp(
|
||||
dependencies, temp_dir, preserve_structure=True, project_root=self.test_dir
|
||||
)
|
||||
|
||||
# Should preserve directory structure
|
||||
for src_path, dest_path in copied_files.items():
|
||||
relative_path = os.path.relpath(src_path, self.test_dir)
|
||||
expected_dest = os.path.join(temp_dir, relative_path)
|
||||
self.assertEqual(dest_path, expected_dest)
|
||||
|
||||
def test_copy_dependencies_to_temp_nonexistent(self):
|
||||
"""Test copying non-existent dependencies"""
|
||||
dependencies = {os.path.join(self.test_dir, "nonexistent.h")}
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
copied_files = self.analyzer.copy_dependencies_to_temp(dependencies, temp_dir)
|
||||
|
||||
# Should skip non-existent files
|
||||
self.assertEqual(len(copied_files), 0)
|
||||
|
||||
def test_validate_dependencies_valid(self):
|
||||
"""Test validation of valid dependencies"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
dependencies = self.analyzer.collect_file_dependencies(main_c_path, self.test_dir)
|
||||
|
||||
is_valid, errors = self.analyzer.validate_dependencies(dependencies)
|
||||
|
||||
self.assertTrue(is_valid)
|
||||
self.assertEqual(len(errors), 0)
|
||||
|
||||
def test_validate_dependencies_invalid(self):
|
||||
"""Test validation with invalid dependencies"""
|
||||
dependencies = {
|
||||
os.path.join(self.test_dir, "utils.h"),
|
||||
os.path.join(self.test_dir, "nonexistent.h")
|
||||
}
|
||||
|
||||
is_valid, errors = self.analyzer.validate_dependencies(dependencies)
|
||||
|
||||
self.assertFalse(is_valid)
|
||||
self.assertGreater(len(errors), 0)
|
||||
self.assertTrue(any("nonexistent.h" in error for error in errors))
|
||||
|
||||
def test_clear_cache(self):
|
||||
"""Test cache clearing functionality"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
|
||||
# First call should populate cache
|
||||
self.analyzer.collect_file_dependencies(main_c_path, self.test_dir)
|
||||
self.assertGreater(len(self.analyzer.dependency_cache), 0)
|
||||
|
||||
# Clear cache
|
||||
self.analyzer.clear_cache()
|
||||
|
||||
# Cache should be empty
|
||||
self.assertEqual(len(self.analyzer.dependency_cache), 0)
|
||||
self.assertEqual(len(self.analyzer.processed_files), 0)
|
||||
|
||||
def test_get_dependency_statistics(self):
|
||||
"""Test dependency statistics generation"""
|
||||
main_c_path = os.path.join(self.test_dir, "main.c")
|
||||
utils_h_path = os.path.join(self.test_dir, "utils.h")
|
||||
|
||||
dependency_map = {
|
||||
main_c_path: {
|
||||
os.path.join(self.test_dir, "utils.h"),
|
||||
os.path.join(self.test_dir, "config.h")
|
||||
},
|
||||
utils_h_path: {
|
||||
os.path.join(self.test_dir, "common.h"),
|
||||
os.path.join(self.test_dir, "platform.h")
|
||||
}
|
||||
}
|
||||
|
||||
stats = self.analyzer.get_dependency_statistics(dependency_map)
|
||||
|
||||
self.assertEqual(stats['total_files'], 2)
|
||||
self.assertEqual(stats['total_dependencies'], 4) # 2 unique dependencies per file
|
||||
self.assertEqual(stats['max_dependencies'], 2)
|
||||
self.assertEqual(stats['min_dependencies'], 2)
|
||||
self.assertEqual(stats['average_dependencies_per_file'], 2.0)
|
||||
|
||||
|
||||
class TestHeaderUtilsConvenienceFunctions(unittest.TestCase):
|
||||
"""Test convenience functions in header_utils module"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test environment"""
|
||||
self.test_dir = tempfile.mkdtemp()
|
||||
|
||||
# Create a simple test file
|
||||
test_c = """
|
||||
#include "test.h"
|
||||
#include <stdio.h>
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, "test.c"), 'w') as f:
|
||||
f.write(test_c)
|
||||
|
||||
test_h = """
|
||||
#ifndef TEST_H
|
||||
#define TEST_H
|
||||
void test_function(void);
|
||||
#endif
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, "test.h"), 'w') as f:
|
||||
f.write(test_h)
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test environment"""
|
||||
shutil.rmtree(self.test_dir, ignore_errors=True)
|
||||
|
||||
def test_extract_local_includes_convenience(self):
|
||||
"""Test convenience function for extracting local includes"""
|
||||
test_c_path = os.path.join(self.test_dir, "test.c")
|
||||
includes = extract_local_includes(test_c_path)
|
||||
|
||||
self.assertEqual(includes, ["test.h"])
|
||||
|
||||
def test_collect_file_dependencies_convenience(self):
|
||||
"""Test convenience function for collecting file dependencies"""
|
||||
test_c_path = os.path.join(self.test_dir, "test.c")
|
||||
dependencies = collect_file_dependencies(test_c_path, self.test_dir)
|
||||
|
||||
# Should include the header file
|
||||
expected_deps = {os.path.join(self.test_dir, "test.h")}
|
||||
self.assertEqual(dependencies, expected_deps)
|
||||
|
||||
def test_copy_dependencies_to_temp_convenience(self):
|
||||
"""Test convenience function for copying dependencies to temp"""
|
||||
test_c_path = os.path.join(self.test_dir, "test.c")
|
||||
dependencies = collect_file_dependencies(test_c_path, self.test_dir)
|
||||
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
copied_files = copy_dependencies_to_temp(dependencies, temp_dir)
|
||||
|
||||
self.assertEqual(len(copied_files), len(dependencies))
|
||||
|
||||
# Verify files were actually copied
|
||||
for dest_path in copied_files.values():
|
||||
self.assertTrue(os.path.exists(dest_path))
|
||||
|
||||
|
||||
class TestHeaderDependencyThreadSafety(unittest.TestCase):
|
||||
"""Test thread safety of header dependency analysis"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test environment"""
|
||||
self.test_dir = tempfile.mkdtemp()
|
||||
|
||||
# Create multiple test files
|
||||
for i in range(5):
|
||||
main_c = f"""
|
||||
#include "header_{i}.h"
|
||||
#include <stdio.h>
|
||||
|
||||
int function_{i}(void) {{
|
||||
return {i};
|
||||
}}
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, f"file_{i}.c"), 'w') as f:
|
||||
f.write(main_c)
|
||||
|
||||
header = f"""
|
||||
#ifndef HEADER_{i}_H
|
||||
#define HEADER_{i}_H
|
||||
int function_{i}(void);
|
||||
#endif
|
||||
"""
|
||||
with open(os.path.join(self.test_dir, f"header_{i}.h"), 'w') as f:
|
||||
f.write(header)
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test environment"""
|
||||
shutil.rmtree(self.test_dir, ignore_errors=True)
|
||||
|
||||
def test_concurrent_dependency_analysis(self):
|
||||
"""Test concurrent dependency analysis with shared analyzer"""
|
||||
import threading
|
||||
import concurrent.futures
|
||||
|
||||
analyzer = create_header_analyzer()
|
||||
results = {}
|
||||
errors = {}
|
||||
|
||||
def analyze_file(file_num):
|
||||
try:
|
||||
file_path = os.path.join(self.test_dir, f"file_{file_num}.c")
|
||||
dependencies = analyzer.collect_file_dependencies(file_path, self.test_dir)
|
||||
results[file_num] = dependencies
|
||||
except Exception as e:
|
||||
errors[file_num] = str(e)
|
||||
|
||||
# Run multiple analyses concurrently
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
|
||||
futures = [executor.submit(analyze_file, i) for i in range(5)]
|
||||
concurrent.futures.wait(futures)
|
||||
|
||||
# All analyses should complete without errors
|
||||
self.assertEqual(len(errors), 0)
|
||||
self.assertEqual(len(results), 5)
|
||||
|
||||
# Each result should contain the expected header
|
||||
for file_num, dependencies in results.items():
|
||||
expected_header = os.path.join(self.test_dir, f"header_{file_num}.h")
|
||||
self.assertIn(expected_header, dependencies)
|
||||
|
||||
def test_separate_analyzers_isolation(self):
|
||||
"""Test that separate analyzers don't interfere with each other"""
|
||||
import threading
|
||||
import concurrent.futures
|
||||
|
||||
results = {}
|
||||
|
||||
def analyze_with_separate_analyzer(file_num):
|
||||
analyzer = create_header_analyzer()
|
||||
file_path = os.path.join(self.test_dir, f"file_{file_num}.c")
|
||||
dependencies = analyzer.collect_file_dependencies(file_path, self.test_dir)
|
||||
results[file_num] = dependencies
|
||||
|
||||
# Run with separate analyzers
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
|
||||
futures = [executor.submit(analyze_with_separate_analyzer, i) for i in range(5)]
|
||||
concurrent.futures.wait(futures)
|
||||
|
||||
# All analyses should complete successfully
|
||||
self.assertEqual(len(results), 5)
|
||||
|
||||
# Results should be isolated
|
||||
for file_num, dependencies in results.items():
|
||||
expected_header = os.path.join(self.test_dir, f"header_{file_num}.h")
|
||||
self.assertIn(expected_header, dependencies)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@ -0,0 +1,691 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Comprehensive test suite for the optimized batch processing system.
|
||||
Tests all components including API workers, CBMC workers, pipeline coordinator, and integration.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
import tempfile
|
||||
import shutil
|
||||
import time
|
||||
import threading
|
||||
from unittest.mock import Mock, patch, MagicMock
|
||||
from datetime import datetime
|
||||
from typing import List, Dict, Any
|
||||
|
||||
# Add project root to path
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
||||
|
||||
from src.tools.optimized_batch_processor import (
|
||||
OptimizedBatchProcessor, ApiWorkerPool, CbmcWorkerPool,
|
||||
WorkQueue, PipelineCoordinator, PipelineMetrics,
|
||||
ApiGenerationTask, ApiGenerationResult,
|
||||
CbmcVerificationTask, CbmcVerificationResult,
|
||||
create_optimized_config
|
||||
)
|
||||
from src.tools.api_worker import ApiWorker, ApiWorkerWithRetry
|
||||
from src.tools.cbmc_worker import CbmcWorker, CbmcWorkerWithTimeout
|
||||
from src.tools.result_aggregator import ResultAggregator, PipelineMetrics as AggregatorPipelineMetrics
|
||||
from util.rate_limiter import TokenBucketRateLimiter
|
||||
from src.tools.file_job_runner import ProcessingResult
|
||||
|
||||
|
||||
class TestOptimizedBatchProcessor(unittest.TestCase):
|
||||
"""Test cases for OptimizedBatchProcessor"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test fixtures"""
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.config = create_optimized_config()
|
||||
self.config['output_dir'] = self.temp_dir
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test fixtures"""
|
||||
shutil.rmtree(self.temp_dir, ignore_errors=True)
|
||||
|
||||
def test_create_optimized_config(self):
|
||||
"""Test optimized configuration creation"""
|
||||
config = create_optimized_config()
|
||||
self.assertIsInstance(config, dict)
|
||||
self.assertIn('api_workers', config)
|
||||
self.assertIn('cbmc_workers', config)
|
||||
self.assertIn('queue_size', config)
|
||||
self.assertEqual(config['api_workers'], 4)
|
||||
self.assertEqual(config['cbmc_workers'], 2)
|
||||
self.assertEqual(config['queue_size'], 50)
|
||||
|
||||
def test_optimized_processor_initialization(self):
|
||||
"""Test OptimizedBatchProcessor initialization"""
|
||||
processor = OptimizedBatchProcessor(self.config)
|
||||
self.assertIsInstance(processor, OptimizedBatchProcessor)
|
||||
self.assertEqual(processor.config['api_workers'], 4)
|
||||
self.assertEqual(processor.config['cbmc_workers'], 2)
|
||||
|
||||
def test_discover_source_files(self):
|
||||
"""Test source file discovery"""
|
||||
# Create test files
|
||||
test_files = ['test1.c', 'test2.cpp', 'test3.h']
|
||||
for filename in test_files:
|
||||
with open(os.path.join(self.temp_dir, filename), 'w') as f:
|
||||
f.write('// Test file\n')
|
||||
|
||||
processor = OptimizedBatchProcessor(self.config)
|
||||
source_files = processor.discover_source_files(self.temp_dir)
|
||||
|
||||
# Should find .c and .cpp files, but not .h files
|
||||
self.assertEqual(len(source_files), 2)
|
||||
self.assertTrue(any('test1.c' in f for f in source_files))
|
||||
self.assertTrue(any('test2.cpp' in f for f in source_files))
|
||||
|
||||
|
||||
class TestApiWorker(unittest.TestCase):
|
||||
"""Test cases for API worker components"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test fixtures"""
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.rate_limiter = TokenBucketRateLimiter(rate=10.0, burst=5)
|
||||
self.worker = ApiWorker(self.rate_limiter, verbose=False)
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test fixtures"""
|
||||
shutil.rmtree(self.temp_dir, ignore_errors=True)
|
||||
|
||||
def test_api_generation_task_creation(self):
|
||||
"""Test ApiGenerationTask creation"""
|
||||
task = ApiGenerationTask(
|
||||
file_path="/test/test.c",
|
||||
source_code="// Test code",
|
||||
task_id="test_001"
|
||||
)
|
||||
self.assertEqual(task.file_path, "/test/test.c")
|
||||
self.assertEqual(task.source_code, "// Test code")
|
||||
self.assertEqual(task.task_id, "test_001")
|
||||
|
||||
def test_api_generation_result_creation(self):
|
||||
"""Test ApiGenerationResult creation"""
|
||||
result = ApiGenerationResult(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_time=1.5,
|
||||
status="SUCCESS"
|
||||
)
|
||||
self.assertEqual(result.task_id, "test_001")
|
||||
self.assertEqual(result.status, "SUCCESS")
|
||||
self.assertEqual(result.api_time, 1.5)
|
||||
|
||||
@patch('src.tools.api_worker.request_deepseek_engine')
|
||||
@patch('src.tools.api_worker.create_generation_prompt_config')
|
||||
def test_api_worker_process_task_success(self, mock_config, mock_api):
|
||||
"""Test successful API task processing"""
|
||||
# Mock API response
|
||||
mock_api.return_value = {'choices': [{'message': {'content': '// Generated code'}}]}
|
||||
mock_config.return_value = {'test': 'config'}
|
||||
|
||||
task = ApiGenerationTask(
|
||||
file_path="/test/test.c",
|
||||
source_code="// Test code",
|
||||
task_id="test_001"
|
||||
)
|
||||
|
||||
result = self.worker.process_task(task)
|
||||
|
||||
self.assertEqual(result.status, "SUCCESS")
|
||||
self.assertEqual(result.generated_code.strip(), "// Generated code")
|
||||
self.assertGreater(result.api_time, 0)
|
||||
|
||||
@patch('src.tools.api_worker.request_deepseek_engine')
|
||||
@patch('src.tools.api_worker.create_generation_prompt_config')
|
||||
def test_api_worker_process_task_failure(self, mock_config, mock_api):
|
||||
"""Test API task processing failure"""
|
||||
# Mock API failure
|
||||
mock_api.return_value = None
|
||||
mock_config.return_value = {'test': 'config'}
|
||||
|
||||
task = ApiGenerationTask(
|
||||
file_path="/test/test.c",
|
||||
source_code="// Test code",
|
||||
task_id="test_001"
|
||||
)
|
||||
|
||||
result = self.worker.process_task(task)
|
||||
|
||||
self.assertEqual(result.status, "API_FAIL")
|
||||
self.assertIn("None response", result.error_message)
|
||||
|
||||
def test_api_worker_with_retry(self):
|
||||
"""Test API worker with retry functionality"""
|
||||
worker = ApiWorkerWithRetry(self.rate_limiter, max_retries=2, base_delay=0.1)
|
||||
|
||||
task = ApiGenerationTask(
|
||||
file_path="/test/test.c",
|
||||
source_code="// Test code",
|
||||
task_id="test_001"
|
||||
)
|
||||
|
||||
with patch.object(worker, '_parse_api_response', side_effect=Exception("Parse error")):
|
||||
with patch('src.tools.api_worker.request_deepseek_engine') as mock_api:
|
||||
with patch('src.tools.api_worker.create_generation_prompt_config') as mock_config:
|
||||
mock_api.return_value = {'choices': [{'message': {'content': '// Code'}}]}
|
||||
mock_config.return_value = {'test': 'config'}
|
||||
|
||||
start_time = time.time()
|
||||
result = worker.process_task(task)
|
||||
elapsed = time.time() - start_time
|
||||
|
||||
# Should have retried and failed
|
||||
self.assertEqual(result.status, "API_FAIL")
|
||||
self.assertIn("Failed after 3 attempts", result.error_message)
|
||||
# Should have taken time for retries (2 delays: 0.1s and 0.2s)
|
||||
self.assertGreater(elapsed, 0.25)
|
||||
|
||||
|
||||
class TestCbmcWorker(unittest.TestCase):
|
||||
"""Test cases for CBMC worker components"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test fixtures"""
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.worker = CbmcWorker(self.temp_dir, verbose=False)
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test fixtures"""
|
||||
shutil.rmtree(self.temp_dir, ignore_errors=True)
|
||||
|
||||
def test_cbmc_verification_task_creation(self):
|
||||
"""Test CbmcVerificationTask creation"""
|
||||
api_result = ApiGenerationResult(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_time=1.5,
|
||||
status="SUCCESS"
|
||||
)
|
||||
|
||||
task = CbmcVerificationTask(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_result=api_result
|
||||
)
|
||||
self.assertEqual(task.task_id, "test_001")
|
||||
self.assertEqual(task.generated_code, "// Generated code")
|
||||
|
||||
def test_cbmc_verification_result_creation(self):
|
||||
"""Test CbmcVerificationResult creation"""
|
||||
processing_result = ProcessingResult(
|
||||
file_path="/test/test.c",
|
||||
status="SUCCESS",
|
||||
api_time=1.5,
|
||||
cbmc_time=2.0,
|
||||
total_time=3.5
|
||||
)
|
||||
|
||||
result = CbmcVerificationResult(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
cbmc_time=2.0,
|
||||
status="SUCCESS",
|
||||
verification_result="",
|
||||
output_files={},
|
||||
processing_result=processing_result
|
||||
)
|
||||
self.assertEqual(result.task_id, "test_001")
|
||||
self.assertEqual(result.status, "SUCCESS")
|
||||
self.assertEqual(result.cbmc_time, 2.0)
|
||||
|
||||
@patch('src.tools.cbmc_worker.validate_cbmc')
|
||||
def test_cbmc_worker_process_task_success(self, mock_cbmc):
|
||||
"""Test successful CBMC task processing"""
|
||||
mock_cbmc.return_value = "" # Empty string means success
|
||||
|
||||
api_result = ApiGenerationResult(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_time=1.5,
|
||||
status="SUCCESS"
|
||||
)
|
||||
|
||||
task = CbmcVerificationTask(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_result=api_result
|
||||
)
|
||||
|
||||
result = self.worker.process_task(task)
|
||||
|
||||
self.assertEqual(result.status, "SUCCESS")
|
||||
self.assertEqual(result.verification_result, "")
|
||||
self.assertGreater(result.cbmc_time, 0)
|
||||
|
||||
@patch('src.tools.cbmc_worker.validate_cbmc')
|
||||
def test_cbmc_worker_process_task_failure(self, mock_cbmc):
|
||||
"""Test CBMC task processing failure"""
|
||||
mock_cbmc.return_value = "CBMC verification failed" # Non-empty means failure
|
||||
|
||||
api_result = ApiGenerationResult(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_time=1.5,
|
||||
status="SUCCESS"
|
||||
)
|
||||
|
||||
task = CbmcVerificationTask(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_result=api_result
|
||||
)
|
||||
|
||||
result = self.worker.process_task(task)
|
||||
|
||||
self.assertEqual(result.status, "VERIFY_FAIL")
|
||||
self.assertIn("CBMC verification failed", result.verification_result)
|
||||
|
||||
|
||||
class TestWorkQueue(unittest.TestCase):
|
||||
"""Test cases for WorkQueue"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test fixtures"""
|
||||
self.queue = WorkQueue(max_size=3)
|
||||
|
||||
def test_work_queue_put_and_get(self):
|
||||
"""Test putting and getting tasks from queue"""
|
||||
api_result = ApiGenerationResult(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_time=1.5,
|
||||
status="SUCCESS"
|
||||
)
|
||||
|
||||
task = CbmcVerificationTask(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_result=api_result
|
||||
)
|
||||
|
||||
# Put task
|
||||
success = self.queue.put(task)
|
||||
self.assertTrue(success)
|
||||
|
||||
# Get task
|
||||
retrieved_task = self.queue.get()
|
||||
self.assertIsNotNone(retrieved_task)
|
||||
self.assertEqual(retrieved_task.task_id, "test_001")
|
||||
|
||||
def test_work_queue_full(self):
|
||||
"""Test queue behavior when full"""
|
||||
api_result = ApiGenerationResult(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_time=1.5,
|
||||
status="SUCCESS"
|
||||
)
|
||||
|
||||
# Fill queue to capacity
|
||||
tasks = []
|
||||
for i in range(3): # max_size = 3
|
||||
task = CbmcVerificationTask(
|
||||
task_id=f"test_{i:03d}",
|
||||
file_path="/test/test.c",
|
||||
generated_code=f"// Generated code {i}",
|
||||
api_result=api_result
|
||||
)
|
||||
tasks.append(task)
|
||||
success = self.queue.put(task)
|
||||
self.assertTrue(success)
|
||||
|
||||
# Try to put one more task
|
||||
extra_task = CbmcVerificationTask(
|
||||
task_id="test_extra",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Extra code",
|
||||
api_result=api_result
|
||||
)
|
||||
|
||||
# Should fail immediately with timeout=0
|
||||
success = self.queue.put(extra_task, timeout=0)
|
||||
self.assertFalse(success)
|
||||
|
||||
def test_work_queue_empty(self):
|
||||
"""Test queue behavior when empty"""
|
||||
# Try to get task from empty queue
|
||||
task = self.queue.get(timeout=0.1)
|
||||
self.assertIsNone(task)
|
||||
|
||||
def test_work_queue_size(self):
|
||||
"""Test queue size reporting"""
|
||||
self.assertEqual(self.queue.qsize(), 0)
|
||||
|
||||
api_result = ApiGenerationResult(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_time=1.5,
|
||||
status="SUCCESS"
|
||||
)
|
||||
|
||||
task = CbmcVerificationTask(
|
||||
task_id="test_001",
|
||||
file_path="/test/test.c",
|
||||
generated_code="// Generated code",
|
||||
api_result=api_result
|
||||
)
|
||||
|
||||
self.queue.put(task)
|
||||
self.assertEqual(self.queue.qsize(), 1)
|
||||
|
||||
retrieved_task = self.queue.get()
|
||||
self.assertEqual(self.queue.qsize(), 0)
|
||||
|
||||
|
||||
class TestPipelineCoordinator(unittest.TestCase):
|
||||
"""Test cases for PipelineCoordinator"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test fixtures"""
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.rate_limiter = TokenBucketRateLimiter(rate=10.0, burst=5)
|
||||
self.api_pool = ApiWorkerPool(2, self.rate_limiter, verbose=False)
|
||||
self.cbmc_pool = CbmcWorkerPool(2, self.temp_dir, verbose=False)
|
||||
self.work_queue = WorkQueue(max_size=5)
|
||||
self.shutdown_handler = Mock()
|
||||
self.shutdown_handler.should_shutdown.return_value = False
|
||||
|
||||
self.coordinator = PipelineCoordinator(
|
||||
self.api_pool, self.cbmc_pool, self.work_queue, self.shutdown_handler
|
||||
)
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test fixtures"""
|
||||
self.coordinator.shutdown()
|
||||
shutil.rmtree(self.temp_dir, ignore_errors=True)
|
||||
|
||||
def test_pipeline_coordinator_submit_api_task(self):
|
||||
"""Test submitting API tasks to coordinator"""
|
||||
task = ApiGenerationTask(
|
||||
file_path="/test/test.c",
|
||||
source_code="// Test code",
|
||||
task_id="test_001"
|
||||
)
|
||||
|
||||
self.coordinator.submit_api_task(task)
|
||||
|
||||
progress = self.coordinator.get_progress()
|
||||
self.assertEqual(progress['api_tasks_submitted'], 1)
|
||||
|
||||
def test_pipeline_coordinator_get_progress(self):
|
||||
"""Test progress reporting"""
|
||||
progress = self.coordinator.get_progress()
|
||||
|
||||
expected_keys = [
|
||||
'api_tasks_submitted', 'api_tasks_completed', 'cbmc_tasks_completed',
|
||||
'queue_size', 'api_workers_active', 'cbmc_workers_active',
|
||||
'queue_max_depth', 'api_total_time', 'cbmc_total_time'
|
||||
]
|
||||
|
||||
for key in expected_keys:
|
||||
self.assertIn(key, progress)
|
||||
|
||||
# Initial state should be all zeros
|
||||
self.assertEqual(progress['api_tasks_submitted'], 0)
|
||||
self.assertEqual(progress['queue_size'], 0)
|
||||
|
||||
|
||||
class TestResultAggregator(unittest.TestCase):
|
||||
"""Test cases for enhanced ResultAggregator"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test fixtures"""
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
self.aggregator = ResultAggregator("test_batch", self.temp_dir, processing_mode="optimized")
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test fixtures"""
|
||||
shutil.rmtree(self.temp_dir, ignore_errors=True)
|
||||
|
||||
def test_result_aggregator_initialization(self):
|
||||
"""Test ResultAggregator with optimized mode"""
|
||||
self.assertEqual(self.aggregator.processing_mode, "optimized")
|
||||
self.assertEqual(self.aggregator.batch_id, "test_batch")
|
||||
self.assertEqual(self.aggregator.output_dir, self.temp_dir)
|
||||
|
||||
def test_set_pipeline_metrics(self):
|
||||
"""Test setting pipeline metrics"""
|
||||
metrics = AggregatorPipelineMetrics(
|
||||
api_tasks_submitted=10,
|
||||
api_tasks_completed=8,
|
||||
cbmc_tasks_completed=7,
|
||||
api_total_time=15.5,
|
||||
cbmc_total_time=12.3,
|
||||
queue_max_depth=5,
|
||||
api_workers_active=2,
|
||||
cbmc_workers_active=1,
|
||||
start_time=time.time() - 30,
|
||||
end_time=time.time()
|
||||
)
|
||||
|
||||
self.aggregator.set_pipeline_metrics(metrics)
|
||||
self.assertIsNotNone(self.aggregator.pipeline_metrics)
|
||||
self.assertEqual(self.aggregator.pipeline_metrics.api_tasks_submitted, 10)
|
||||
|
||||
def test_calculate_pipeline_efficiency(self):
|
||||
"""Test pipeline efficiency calculation"""
|
||||
# Create metrics with known values
|
||||
start_time = time.time() - 30 # Started 30 seconds ago
|
||||
end_time = time.time()
|
||||
metrics = AggregatorPipelineMetrics(
|
||||
api_tasks_submitted=10,
|
||||
api_tasks_completed=8,
|
||||
cbmc_tasks_completed=7,
|
||||
api_total_time=20.0, # 20 seconds of API work
|
||||
cbmc_total_time=15.0, # 15 seconds of CBMC work
|
||||
queue_max_depth=5,
|
||||
api_workers_active=2,
|
||||
cbmc_workers_active=1,
|
||||
start_time=start_time,
|
||||
end_time=end_time
|
||||
)
|
||||
|
||||
self.aggregator.set_pipeline_metrics(metrics)
|
||||
|
||||
efficiency = self.aggregator.calculate_pipeline_efficiency()
|
||||
self.assertGreater(efficiency, 0.0)
|
||||
self.assertLessEqual(efficiency, 1.0)
|
||||
|
||||
def test_calculate_throughput_improvement(self):
|
||||
"""Test throughput improvement calculation"""
|
||||
# Add some results with known processing times
|
||||
for i in range(5):
|
||||
result = ProcessingResult(
|
||||
file_path=f"/test/test{i}.c",
|
||||
status="SUCCESS",
|
||||
api_time=2.0,
|
||||
cbmc_time=3.0,
|
||||
total_time=5.0
|
||||
)
|
||||
self.aggregator.add_result(result)
|
||||
|
||||
# Create pipeline metrics
|
||||
start_time = time.time() - 10 # 10 seconds ago
|
||||
end_time = time.time()
|
||||
metrics = AggregatorPipelineMetrics(
|
||||
api_tasks_submitted=5,
|
||||
api_tasks_completed=5,
|
||||
cbmc_tasks_completed=5,
|
||||
api_total_time=10.0,
|
||||
cbmc_total_time=15.0,
|
||||
start_time=start_time,
|
||||
end_time=end_time
|
||||
)
|
||||
|
||||
self.aggregator.set_pipeline_metrics(metrics)
|
||||
|
||||
improvement = self.aggregator.calculate_throughput_improvement()
|
||||
# Should be positive (parallel is faster than sequential)
|
||||
self.assertGreater(improvement, 0.0)
|
||||
|
||||
|
||||
class TestRateLimiterOptimizations(unittest.TestCase):
|
||||
"""Test cases for enhanced rate limiter"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test fixtures"""
|
||||
self.rate_limiter = TokenBucketRateLimiter(rate=5.0, burst=10)
|
||||
|
||||
def test_try_acquire_success(self):
|
||||
"""Test successful non-blocking token acquisition"""
|
||||
success = self.rate_limiter.try_acquire()
|
||||
self.assertTrue(success)
|
||||
|
||||
def test_try_acquire_failure(self):
|
||||
"""Test failed non-blocking token acquisition"""
|
||||
# Drain all tokens
|
||||
for _ in range(10): # burst capacity
|
||||
self.rate_limiter.try_acquire()
|
||||
|
||||
# Next attempt should fail
|
||||
success = self.rate_limiter.try_acquire()
|
||||
self.assertFalse(success)
|
||||
|
||||
def test_acquire_batch_success(self):
|
||||
"""Test successful batch token acquisition"""
|
||||
success = self.rate_limiter.acquire_batch(3)
|
||||
self.assertTrue(success)
|
||||
|
||||
def test_acquire_batch_failure(self):
|
||||
"""Test failed batch token acquisition"""
|
||||
# Try to acquire more than burst capacity
|
||||
success = self.rate_limiter.acquire_batch(15) # burst is 10
|
||||
self.assertFalse(success)
|
||||
|
||||
def test_try_acquire_batch_success(self):
|
||||
"""Test successful non-blocking batch token acquisition"""
|
||||
success = self.rate_limiter.try_acquire_batch(2)
|
||||
self.assertTrue(success)
|
||||
|
||||
def test_try_acquire_batch_failure(self):
|
||||
"""Test failed non-blocking batch token acquisition"""
|
||||
# Drain tokens
|
||||
for _ in range(5): # Leave some tokens
|
||||
self.rate_limiter.try_acquire()
|
||||
|
||||
# Try to acquire more than available
|
||||
success = self.rate_limiter.try_acquire_batch(10)
|
||||
self.assertFalse(success)
|
||||
|
||||
def test_get_detailed_status(self):
|
||||
"""Test detailed status reporting"""
|
||||
status = self.rate_limiter.get_detailed_status()
|
||||
|
||||
expected_keys = [
|
||||
'tokens_available', 'tokens_capacity', 'refill_rate',
|
||||
'tokens_needed', 'wait_time', 'time_since_refill',
|
||||
'next_refill_tokens', 'utilization_percent'
|
||||
]
|
||||
|
||||
for key in expected_keys:
|
||||
self.assertIn(key, status)
|
||||
|
||||
self.assertGreaterEqual(status['tokens_available'], 0)
|
||||
self.assertLessEqual(status['tokens_available'], status['tokens_capacity'])
|
||||
|
||||
|
||||
class TestIntegration(unittest.TestCase):
|
||||
"""Integration tests for the complete optimized pipeline"""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up test fixtures"""
|
||||
self.temp_dir = tempfile.mkdtemp()
|
||||
|
||||
# Create test input directory with sample files
|
||||
self.input_dir = os.path.join(self.temp_dir, "input")
|
||||
self.output_dir = os.path.join(self.temp_dir, "output")
|
||||
os.makedirs(self.input_dir)
|
||||
os.makedirs(self.output_dir)
|
||||
|
||||
# Create sample C files
|
||||
sample_files = [
|
||||
("test1.c", """
|
||||
#include <stdio.h>
|
||||
int main() {
|
||||
printf("Hello World");
|
||||
return 0;
|
||||
}
|
||||
"""),
|
||||
("test2.c", """
|
||||
int add(int a, int b) {
|
||||
return a + b;
|
||||
}
|
||||
""")
|
||||
]
|
||||
|
||||
for filename, content in sample_files:
|
||||
with open(os.path.join(self.input_dir, filename), 'w') as f:
|
||||
f.write(content)
|
||||
|
||||
def tearDown(self):
|
||||
"""Clean up test fixtures"""
|
||||
shutil.rmtree(self.temp_dir, ignore_errors=True)
|
||||
|
||||
@patch('src.tools.api_worker.request_deepseek_engine')
|
||||
@patch('src.tools.cbmc_worker.validate_cbmc')
|
||||
def test_complete_pipeline_integration(self, mock_cbmc, mock_api):
|
||||
"""Test integration of complete optimized pipeline"""
|
||||
# Mock successful API responses
|
||||
mock_api.return_value = {'choices': [{'message': {'content': '// Generated assertions'}}]}
|
||||
mock_cbmc.return_value = "" # CBMC success
|
||||
|
||||
config = create_optimized_config()
|
||||
config['output_dir'] = self.output_dir
|
||||
config['api_workers'] = 2
|
||||
config['cbmc_workers'] = 1
|
||||
config['queue_size'] = 5
|
||||
|
||||
processor = OptimizedBatchProcessor(config)
|
||||
aggregator = processor.process_batch(self.input_dir, self.output_dir)
|
||||
|
||||
# Should have processed files
|
||||
self.assertGreater(len(aggregator.results), 0)
|
||||
|
||||
# Check that results are from optimized processing
|
||||
self.assertEqual(aggregator.processing_mode, "optimized")
|
||||
|
||||
# Verify pipeline metrics were collected
|
||||
progress = processor.coordinator.get_progress()
|
||||
self.assertGreaterEqual(progress['api_tasks_completed'], 0)
|
||||
self.assertGreaterEqual(progress['cbmc_tasks_completed'], 0)
|
||||
|
||||
def test_pipeline_vs_standard_comparison(self):
|
||||
"""Test that optimized pipeline shows performance characteristics"""
|
||||
# This test verifies the structure but doesn't measure actual performance
|
||||
config = create_optimized_config()
|
||||
config['output_dir'] = self.output_dir
|
||||
|
||||
processor = OptimizedBatchProcessor(config)
|
||||
|
||||
# Should have the right structure
|
||||
self.assertIsInstance(processor.api_pool, ApiWorkerPool)
|
||||
self.assertIsInstance(processor.cbmc_pool, CbmcWorkerPool)
|
||||
self.assertIsInstance(processor.work_queue, WorkQueue)
|
||||
self.assertIsInstance(processor.coordinator, PipelineCoordinator)
|
||||
|
||||
# Configuration should be set correctly
|
||||
self.assertEqual(processor.config['api_workers'], 4)
|
||||
self.assertEqual(processor.config['cbmc_workers'], 2)
|
||||
self.assertEqual(processor.config['queue_size'], 50)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Run tests with detailed output
|
||||
unittest.main(verbosity=2)
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue